双向一对一唯一外键关联

来源:互联网 发布:郑州淘大网络 编辑:程序博客网 时间:2024/06/06 11:04
hibernate一对一唯一外键关联映射(双向关联Person<----->IdCard)
原理跟单向一对一唯一外键关联是一样的,都是加个外键,影响的只是对象模型

一对一唯一外键关联双向采用<one-to-one>标签映射,必须指定<one-to-one>标签中的property-ref属性为关系字段的名称


对象模型如下:



public class Person {

private int id;

private String name;

private IdCard idCard;

}

public class IdCard {

private int id;

private String cardNo;

private Person person;

}

具体映射如下:

Person.hbm.xml

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>

idCard.hbm.xml

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<!-- 表示指向person表中的idCard字段,这样来进行关联 -->
<one-to-one name="person" property-ref="idCard"/>

</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("1111111111111111");

Person person = new Person();
person.setName("张三");
//建立关联
person.setIdCard(idCard);

//抛出TransientObjectException
//因为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("1111111111111111");
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("person.cardNo=" + person.getIdCard().getCardNo());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testLoad2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idCard = (IdCard)session.load(IdCard.class, 1);
System.out.println("idCard.cardNo=" + idCard.getCardNo());
System.out.println("idCard.person.name=" + idCard.getPerson().getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

}

原创粉丝点击