private Integer id;
private String cardNo;
//一系列的getter.setter方法
@Override
public String toString() {
// TODO Auto-generated method stub
return "Idcard:" + cardNo;
}
}
private Integer id;
private String name;
private IdCard idCard;
//一系列的setter.getter方法
@Override
public String toString() {
// TODO Auto-generated method stub
return "Person:" + name;
}
}
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
</class>
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--many-to-one标签的含义,是在本表中增加外键指向另一端。
unique="true"含义,是本表的本字段加上唯一性约束.
-->
<many-to-one name="idcard_id" unique="true"></many-to-one>
</class>
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard=new IdCard();
idCard.setCardNo("1234567890");
Person person=new Person();
person.setIdCard(idCard);
//不能成功保存,会报错org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sxt.hibernate.one2one.entity.IdCard
//因为idCard是transient状态
//要在<many-to-one>中加上cascade="save-update",或者是在session.save(person)之前session.save(idCard)
session.save(person);*/
/* IdCard idCard=new IdCard();
idCard.setCardNo("1234567890");
session.save(idCard);
Person person=new Person();
person.setName("张三");
person.setIdCard(idCard);
session.save(person);*/
/**
* 小结:一对一唯一外键关联是多対一关联的特例,它不会默认有cascade属性,因此save对象时要保证它的关联属性是持久化状态的或者手动设置cascade属性.
*/
/**
* 测试加载操作
*/
Person p=(Person)session.load(Person.class, 2);
System.out.println(p);
System.out.println(p.getIdCard());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}