天天看点

hibernate一对一唯一外键关联映射(双向关联PersonIdCard)

public class Person {
 
 private int id;
 private String name;
 private IdCard idCard;
  public IdCard getIdCard() {
  return idCard;
 } public void setIdCard(IdCard idCard) {
  this.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;
 }}
 
IdCard类
public class IdCard {
 
 private int id;
 private String cardNo;
 private Person person; 
 public Person getPerson() {
  return person;
 } public void setPerson(Person person) {
  this.person = person;
 } 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;
 }}
2:配置文件
Person类的配置文件
<hibernate-mapping >
  <class name="com.bjsxt.hibernate.Person" table="t_person">
     <id name="id">
         <generator class="native"></generator>
     </id>
     <property name="name"></property>
    <many-to-one name="idCard" unique="true"/>
  </class>
</hibernate-mapping> 
IdCard类的配置文件
<hibernate-mapping >
  <class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
     <id name="id">
         <generator class="native"/>
     </id>
     <property name="cardNo"></property>   
     <one-to-one name="person" property-ref="idCard" cascade="all"/> 
  </class>
</hibernate-mapping> 
3:测试程序
 
public void testSave1(){
  Session session = null;
  try{
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = new IdCard();
   idCard.setCardNo("88888888888888");
   
   Person person = new Person();
   person.setIdCard(idCard);
   person.setName("aaa");
   
   //不能成功保存,因为idCard是Transient状态
   session.save(person);
   
   session.getTransaction().commit();
   
  }catch(Exception e){
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtils.closeSession(session);
  } 
 }
 //首先保存IdCard对象,然后保存Person对象
 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.setIdCard(idCard);
   person.setName("张波");
   
   session.save(person);
   session.getTransaction().commit();
   
  }catch(Exception e){
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtils.closeSession(session);
  } 
 }
 //首先加载Person对象,然后加载IdCard对象
 public void testLoad1(){
  Session session = null;
  try{
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Person person = (Person)session.load(Person.class,5);
   System.out.println(person.getName());
   System.out.println(person.getIdCard().getCardNo());
    
   session.getTransaction().commit();
   
  }catch(Exception e){
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally{
   HibernateUtils.closeSession(session);
  } 
 }
 //首先加载IdCard对象,然后加载Person对象
 public void testLoad2(){
  Session session = null;
  try{
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   IdCard idCard = (IdCard)session.load(IdCard.class,2);
   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);
  } 
 }4:总结
hibernate一对一唯一外键关联映射(双向关联Person<----->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,
指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联
映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键加载
person,而要根据person的外键加载,所以采用如下映射方式:
        <one-to-one name="person" property-ref="idCard"/>