【Hibernate】一对一主键关联映射

来源:互联网 发布:淘宝folk老王是正品吗 编辑:程序博客网 时间:2024/05/22 06:26
【回顾】
    上篇博客内容是对Hibernate实体间多对一关联关系的学习和总结,本篇博客继续关联映射的学习,实体间关系为一对一。    
【一对一】
    1. 原理:让两个实体的主键一样,这样就不需要加入多余的字段了。
    2. 示例:在用户Person从表中,存在一个id字段作为主键,而在另一个身份证信息IDCard主表中,同样存在一个id字段是主键,且这两个字段相同。所以用户Person从表与身份证信息IDCard主表之间是存在一对一关系的。
    3. 实体类代码:
Person实体:package com.bjpowernode.hibernate;public class Person {    private int id;        private String name;    //将IDCard实体引用到Person实体中    private IdCard idCard;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public IdCard getIdCard() {        return idCard;    }    public void setIdCard(IdCard idCard) {        this.idCard = idCard;    }}IDCard实体类:package com.bjpowernode.hibernate;public class IdCard {        private int id;        private String cardNo;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getCardNo() {        return cardNo;    }    public void setCardNo(String cardNo) {        this.cardNo = cardNo;    }}
      4. 关联配置映射文件:
IDCard.hbm.xml:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">        <id name="id">        <!-- 该实体主键生成策略为native,根据数据库系统自动设置 -->            <generator class="native"/>        </id>        <property name="cardNo"/>    </class></hibernate-mapping>  Person.hbm.xml:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.bjpowernode.hibernate.Person" table="t_person">        <id name="id">            <!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->            <generator class="foreign">                <!-- 添加参数,property指关联对象 -->                <param name="property">idCard</param>            </generator>        </id>        <property name="name"/>        <!--             one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载            也就是拿到关系字段值,根据对端的主键来加载关联对象                    constrained="true表示,当前主键(person的主键)还是一个外键            参照了对端的主键(IdCard的主键),也就是会生成外键约束语句         -->        <one-to-one name="idCard" constrained="true"/>    </class></hibernate-mapping>  
    5. 小结: 
    对于一对一关联关系:
        在定义实体类的时候,在从表实体中引用主表实体。
        在配置关系映射的时候,需要在从表实体的配置文件中,将主键生成策略设置为foreign,添加参数设置,值为引用的对象,且默认了cascade属性;添加<one-to-one>标签,配置其name属性,也是引用的对象,可以用constrained属性进行外键约束设置。
    上述方法仅是实体间的单向关联,也就是我们只是把IDCard引入到了person中,而IDCard中并没有引用person,所以我们在根据Id值查询的时候,只能通过person查询相关属性,而不能通过IDCard查询相关属性。
    由此,就有了下面的双向关联。
    1. 实体类代码:
    Person实体类代码不变,在IDCard实体类中加入对Person的引用:
package com.bjpowernode.hibernate;public class IdCard {        private int id;        private String cardNo;    //增加对person的引用    private Person person;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getCardNo() {        return cardNo;    }    public void setCardNo(String cardNo) {        this.cardNo = cardNo;    }    public Person getPerson() {        return person;    }    public void setPerson(Person person) {        this.person = person;    }}
     2. 关联配置映射文件:
IDCard配置文件:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">        <id name="id">            <generator class="native"/>        </id>        <property name="cardNo"/>        <!-- 在此配置中同样加上one-to-one标签 -->        <one-to-one name="person"/>    </class></hibernate-mapping>   
    3. 小结:
    对于一对一的双向关联关系:
        在实体类中,互相添加引用关系。
        在映射配置文件中,互相增加<one-to-one>标签的设置。
    这样便可以通过idcard实体类去查询两个表的相关属性,但同样不能通过IDCard去存储新的记录。
【结语】
    上述的单向关联与双向关联都是属于根据主键进行关联映射,即:让两个对象具有相同的主键值,以表明它们之间的一对一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键进行关联。但这样的方法不易扩展,所以,一般采用的方法是唯一外键关联,将在下篇博客中继续学习。

0 0
原创粉丝点击