文章目录
  1. 1. 概述
  2. 2. 主键关联
    1. 2.1. E-R图
    2. 2.2. 对象模型
    3. 2.3. 映射文件
      1. 2.3.1. Person.hbm.xml
      2. 2.3.2. IdCard.hbm.xml
    4. 2.4. 测试方法
  3. 3. 外键关联
    1. 3.1. E-R图
    2. 3.2. 对象模型
    3. 3.3. 映射文件
      1. 3.3.1. Person.hbm.xml
      2. 3.3.2. IdCard.hbm.xml

概述

一对一关联映射指的是两个对象之间是一对一的关系,比如person—id_card。
一对一关联映射可以分为两种:

  1. 主键关联:两个对象具有相同的主键值,以表明他们之间的一一对应的关系,数据库表不会有额外的字段去维护他们之间的关系,仅通过表的主键来关联。
  2. 外键关联:本来是用于一对多的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。

    主键关联

    举例来说明主键关联,数据库中有一张person表,用来存放人员信息,包括姓名和年龄,还有一张id_card表,存放身份证信息。

    E-R图

    E-R图
  • person对象是主对象,id_card对象是从对象
  • id_card表的主键是person表的主键

    对象模型

    1
    2
    3
    4
    5
    6
    7
    public class Person {
    private int id;
    private String name;
    private IdCard idCard;

    //省去get、set方法
    }
1
2
3
4
5
6
7
public class IdCard {
private int id;
private Date usefulLife;
private Person person;

//省去get、set方法
}

映射文件

Person.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 package="cn.zju.domain">

<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<one-to-one name="idCard"/>
</class>

</hibernate-mapping>

IdCard.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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 package="cn.zju.domain">

<class name="IdCard" table="id_card">
<id name="id">
<generator class="foreign">
<param name="property">person</param> <!--主键生成,通过person表的主键来生成自己的主键-->
</generator>

</id>
<property name="usefulLife" column="useful_life"/>

<one-to-one name="person" constrained="true"/>
</class>

</hibernate-mapping>
  • 如果采用基于主键的映射策略,则一端的主键生成器需要使用foreign策略,表明将根据对方的主键来生成自己的主键,本实体不能拥有自己的主键声称策略。
  • 子元素指定使用当前持久化类的哪个属性作为“对方”。
  • 任意一端都可以采用foreign主键生成器策略,表明将根据对方主键来生成自己的主键。
  • 采用foreign主键生成器策略的一端增加one-to-one元素映射相关属性,其ont-to-one属性还应增加constrained=true属性;另一端增加one-to-one元素映射关联属性。
  • constrained:指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联对象所对应的数据库主键。

    测试方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public  void add() {
    Session s = null;
    Transaction tx = null;
    try {
    s = HibernateUtil.getSession();
    IdCard idCard = new IdCard();
    idCard.setUsefulLife(new Date());

    Person p = new Person();
    p.setName("p1");
    p.setIdCard(idCard);

    idCard.setPerson(p);

    tx = s.beginTransaction();
    s.save(p);
    s.save(idCard);
    tx.commit();
    } finally {
    if (s != null)
    s.close();
    }
    }

外键关联

举例来说明主键关联,数据库中有一张person表,用来存放人员信息,包括姓名和年龄,还有一张id_card表,存放身份证信息。

E-R图

E-R图

  • person对象是主对象,id_card对象是从对象
  • id_card表的外键是person表的主键
  • 基于外键的one-to-one,可以理解成多对一,但要加上unique=”true”约束,请注意下文中的映射文件!

    对象模型

    1
    2
    3
    4
    5
    6
    7
    public class Person {
    private int id;
    private String name;
    private IdCard idCard;

    //省去get、set方法
    }
1
2
3
4
5
6
7
public class IdCard {
private int id;
private Date usefulLife;
private Person person;

//省去get、set方法
}

映射文件

Person.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 package="cn.zju.domain">

<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<one-to-one name="idCard" property-ref="person"/>
</class>

</hibernate-mapping>
  • 要使用元素,该元素需要使用name属性指定关联属性名。为了让系统不再为本表增加一列,而是使用外键关联,使用property-ref属性指定引用关联类的属性。

    IdCard.hbm.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?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 package="cn.zju.domain">

    <class name="IdCard" table="id_card">
    <id name="id">
    <generator class="native" /> <!--更换成自增长的ID-->
    </id>
    <property name="usefulLife" column="useful_life"/>

    <many-to-one name="person" column="person_id" unique="true"/>
    </class>

    </hibernate-mapping>
  • 基于外键的1-1关联,外键可以存放在任意一边。需要存放外键的一端,需要增加元素,并且为元素增加unique=”true”属性来表示该实体实际上是1的一端。

  • 对于1-1的关联关系,两个实体原本处于平等状态,但当我们选择任意一个表来增加外键后(增加元素的实体端),该表即变成从表,而另一个表则成为主表。
文章目录
  1. 1. 概述
  2. 2. 主键关联
    1. 2.1. E-R图
    2. 2.2. 对象模型
    3. 2.3. 映射文件
      1. 2.3.1. Person.hbm.xml
      2. 2.3.2. IdCard.hbm.xml
    4. 2.4. 测试方法
  3. 3. 外键关联
    1. 3.1. E-R图
    2. 3.2. 对象模型
    3. 3.3. 映射文件
      1. 3.3.1. Person.hbm.xml
      2. 3.3.2. IdCard.hbm.xml