hibernate一对唯一外键关联映射是多对一关联映射的特例,可以使用<many-to-one>标签,指定多的一端的unique=true,这就限制了多的一端的多重性是以,这种映射一对一唯一外键关联。
实例步骤:
建立POJO类:IdCard.java和Person.java, 创建Hibernate配置文件,把两个hbm文件和其绑定。在Person.java面建立一个IdCard类型的属性。 在Person的hbm文件中添加:<many-to-one name=”idCard” unique=”true”/>
代码实例:
IdCard.java:
public class IdCard {
private int id;
private String cardNo;
Person.java:
public class Person {
private int id;
private String name;
private IdCard idCard;
IdCard.hbm.xml文件:
<hibernate-mapping>
<class name=”IdCard” table=”t_idcard”>
<id name=”id”>
<generator class=”native”/>
</id>
<property name=”cardNo”/>
</class>
</hibernate-mapping>
Person.hbm.xml文件:
<hibernate-mapping>
<class name=”Person” table=”t_person”>
<id name=”id”>
<generator class=”native”/>
</id>
<property name=”name”/>
<many-to-one name=”idCard” unique=”true”/>
</class>
</hibernate-mapping>
测试代码:
public class One2OneTest extends TestCase {
public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo(“88888888888888″);
Person person = new Person();
person.setName(“张三”);
person.setIdCard(idCard);
//不能成功保存,因为IdCard是Transient状态
session.save(person);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testSave2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo(“88888888888888″);
session.save(idCard);
Person person = new Person();
person.setName(“张三”);
person.setIdCard(idCard);
session.save(person);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Person person =
(Person)session.load(Person.class, 2);
System.out.println(“person.name=” +
person.getName());
System.out.println(“idCard.cardNo=” +
person.getIdCard().getCardNo());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
hibernate一对一唯一外键关联双向,需在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载,其关联对象,默认是主键加载person,外键关联映射中,两个实体采用的是person的外键维护的关系,所以不能指定主键加载person,而要依据person的外键加载,因此采用如下映射方式:<one-to-one name=”person” property-ref=”idCard”/>。
步骤基本和单向一致,只需在IdCard.java加入Person对象的引用,并在IdCard.hbm.xml加入<one-to-one>标签,相应代码如下:
IdCard.java加入:
private Person person;
IdCard.hbm.xml加入:
<one-to-one name=”person” property-ref=”idCard”/>