上一節介紹的基于外鍵的一對一映射關系中,在Person表中有一個外鍵列idCard_id,對應的idCard表的主鍵id,至于基于主鍵的一對一映射關系,就是指Person表中抛棄了idcard_id這個外鍵列,而與idCard表共用一個主鍵,或者說是其外鍵為主鍵的表結構,這種基于主鍵的雙向一對一映射關系應該這樣配置:
建立一個IdCard實體類:
public class IdCard {
private int id;
private String code;
private Person person;
//get/set方法省略
}
建立一個Person實體類:
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
//get/set方法省略
}
在目前包下建立IdCard類的映射檔案IdCard.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wang.pojo">
<class name="IdCard" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="code"></property>
<!-- 隻需要添加此标簽就可以 -->
<one-to-one name="person"></one-to-one>
</class>
</hibernate-mapping>
在目前包下建立Person類的映射檔案Person.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wang.pojo">
<class name="Person" >
<id name="id">
<!-- foreign表示引用外鍵 -->
<generator class="foreign">
<!-- 引用idCard表中所對應的主鍵 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"></property>
<property name="age"></property>
<!-- constrained="true" 表示設定主鍵限制為true -->
<one-to-one name="idCard" constrained="true" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
将兩個映射檔案添加到hibernate.cfg.xml中;建立測試類,測試:1,自動生成表2:儲存資料3:讀取資料:
@Test
public void testCreateDB() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
// 第一個參數是否生成ddl腳本 第二個參數是否執行到資料庫
se.create(true, true);
}
@Test
public void testSave() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
// Score s=new Score(2,12,97);
// session.save(s);
IdCard id1=new IdCard();
id1.setCode("3713251882923783494");
IdCard id2=new IdCard();
id2.setCode("3713251882925378612");
Person p1=new Person();
p1.setName("李雲龍");
p1.setAge(41);
p1.setIdCard(id1);
Person p2=new Person();
p2.setName("楚雲飛");
p2.setAge(34);
p2.setIdCard(id2);
session.save(p1);
session.save(p2);
//session.save(p3);
tx.commit();
session.close();
}
@Test
public void testGet() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person p=(Person)session.get(Person.class, 1);
System.out.println("name="+p.getName()+"===idcard="+p.getIdCard().getCode());
IdCard id=(IdCard)session.get(IdCard.class, 1);
System.out.println("name="+id.getPerson().getName()+"==idcard="+id.getCode());
tx.commit();
session.close();
}
以上是基于主鍵的雙向一對一映射關系,如果隻需要設定單向一對一映射,假如隻需要通過Person類能擷取到IdCard類的資訊就可以,不需要通過IdCard來擷取Person中的資訊,隻要把Idcard類中private Perosn person;以及對應get/set方法去掉,然後将IdCard.hbm.xml中的 <one-to-one name="person"></one-to-one>标簽去掉即可.其他地方不需要改變.