好吧,一對一映射是我認爲最好理解的,正如我說的一個蘿蔔一個坑,或者實際一點的例子:一個人只有一個
身份證號:
新建一個Person實體對象:
package com.bjpowernode.hibernate;
/**
* 建立Person實體類
* @author why_768
*
*/
public class Person {
private int id;
private String name;
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;
}
}
配置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生成策略,會取得關聯對象的標識 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- constrained=“true”表示,當前主鍵還是一個外鍵 -->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
新建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) {
CardNo = cardNo;
}
}
配置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">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
這樣就完成了一對一的簡單配置,建立Junit測試類,插入數據:
public void testSave1(){
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo("111111111111");
Person person = new Person();
person.setName("張三");
//建立關聯
person.setIdCard(idCard);
//沒有拋出TransientObjectException異常,是由一對一關聯映射的特性決定的。
//這樣他採用foreign映射策略才能取得關聯對象的標識
session.save(person);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
HibernateUtils.closeSession(session);
}
}
查看數據庫:
至此,一對一的單向關聯映射就完成了。一對一的雙向關聯映射,根據上篇博客說道的一對多雙向關聯映射可
知,在IdCard實體裏添加Person爲屬性,並在IdCard.hbm.xml文件裏再配上<one-to-one name="person">標籤就可
以了。