单向一对一唯一外键关联

来源:互联网 发布:斗鱼抢票软件联系 编辑:程序博客网 时间:2024/06/06 06:42

单向一对一主键关联实际上限制很多,因为你只有IdCard插入了那才能有这个Person.唯一外键关联实际上就是多对一的一个特例,只是加个unique约束而已.

原理图:

采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一,就是这样来映射的。

对象模型:

public class IdCard {

private int id;

private String cardNo;

}

public class Person {

private int id;

private String name;

private IdCard idCard;

}

具体映射如下:

IdCard.hbm.xml

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>

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>


测试如下:

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);
}
}

}

原创粉丝点击