首页 > 代码库 > Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [One To One]

Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [One To One]

1、One To One 单相

 背景:

      古代一个老婆  只能关联一个老公

husband.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.rhythmk.model;
 
public class husband {
     
    public Integer getHusbandId() {
        return husbandId;
    }
    public void setHusbandId(Integer husbandId) {
        this.husbandId = husbandId;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    private Integer husbandId;
    private String Name;
 
}

  hasband.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping  package="com.rhythmk.model">
    <class name="husband" table="t_husband">
        <id name="husbandId" type="int">
            <column name="husbandId" />
            <generator class="native" />
        </id>
        <property name="Name" type="string">
        
        </property>
    
     
    </class>
</hibernate-mapping>

 

wife.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.rhythmk.model;
 
public class wife {
 
    private Integer wifeId;
    private String name;
 
    public Integer getWifeId() {
        return wifeId;
    }
 
    public void setWifeId(Integer wifeId) {
        this.wifeId = wifeId;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
     
    public husband getHb() {
        return hb;
    }
 
    public void setHb(husband hb) {
        this.hb = hb;
    }
 
    private husband  hb;
 
    @Override
    public String toString() {
        return "wife [wifeId=" + wifeId + ", name=" + name + ", hb=" + hb + "]";
    }
     
}

  wife.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping  package="com.rhythmk.model">
    <class name="wife" table="t_wife">
        <id name="wifeId" type="int">
            <column name="wifeId" />
            <generator class="native" />
        </id>
        <property name="Name" type="string">
        </property>
  <!--   one  to  one 类似于  one to many   只需要添加 unique =true 即可 -->
      <many-to-one name="hb"  column="husbandId"  ></many-to-one>
    </class>
</hibernate-mapping>

注意:

    one to one 类似于 one to many 只需要添加 unique =true 即可

 2、One To One 双向

      跟单相查不多  就是两边都配上  many to one

调整 hasband.hbm.xml 添加:

      <!--   one  to  one 类似于  one to many   只需要添加 unique =true 即可 -->
      <many-to-one name="mywife"  column="wifeId"  ></many-to-one>

调整 husband.java :

?
1
2
3
4
5
6
7
public wife getMywife() {
    return mywife;
}
public void setMywife(wife mywife) {
    this.mywife = mywife;
}
private wife mywife;

  测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
public void test02_add() {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
 
        husband hb = new husband();
        hb.setName("王大1");
        wife w = new wife();
        w.setName("张妞 2");
        w.setHb(hb);
        hb.setMywife(w);
        session.save(hb);
        session.save(w);
        System.out.println(w.toString());
        session.getTransaction().commit();
 
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null)
            session.close();
    }
}

  输出:

Hibernate: insert into t_husband (Name, wifeId) values (?, ?)
Hibernate: insert into t_wife (Name, husbandId) values (?, ?)
wife [wifeId=6, name=张妞 2, hb=com.rhythmk.model.husband@8b677f]
Hibernate: update t_husband set Name=?, wifeId=? where husbandId=?