单向一对一关联映射(one-to-one):
Person.hbm.xml
测试类:
两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)
有两种策略可以实现一对一的关联映射:
*主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:
package com.bawei.demo.one2one;
/**
* Person entity. @author MyEclipse Persistence Tools
*/
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;
}
}
IdCard.javapackage com.bawei.demo.one2one;
import java.util.HashSet;
import java.util.Set;
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;
}
}
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.bawei.demo.one2one.IdCard" table="t_idCard">
<id name="id">
<generator class="native">
</generator>
</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.bawei.demo.one2one.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如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
测试类:
public void testSave1() {
Session session = null;
try {
session = new BaseHibernateDAO().getSession();
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo("1111111111111111111");
Person person = new Person();
person.setName("张三");
// 建立关联
person.setIdCard(idCard);
// 没有抛出TransientObjectException
// 是由一对一关联映射的特性决定的,它必须先保存关联对象IdCard
// 这样它采用foreign映射策略才能取得关联对象的标识
// 也就是它默认了cascade属性
session.save(person);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
}
}
public static void main(String[] args) {
new Demo().testSave1();
}