9. 一对一唯一外键关联映射

一对一唯一外键关联映射_单向

       *一对一唯一外键关联映射是多对一关联映射的特例

       *可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一

实例背景:

one-to-one唯一外键关联映射_单向

1. 定义IdCard

package com.bjsxt.hibernate;

public class IdCard {    

       private int id;  

       private String cardNo;

       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. 定义IdCard类的映射文件

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

       <class name="com.bjsxt.hibernate.IdCard" table="t_idcard">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="cardNo"/>

       </class>

</hibernate-mapping>

3. 定义Person

package com.bjsxt.hibernate;

 

public class Person {

 

       private int id;

       private String name;

       private 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;

       }

       public IdCard getIdCard() {

              return idCard;

       }

       public void setIdCard(IdCard idCard) {

              this.idCard = idCard;

       }    

}

4. 定义Person类的映射文件

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

       <class name="com.bjsxt.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>

5. 定义hibernate.cfg.xml,ExportDB.javaHibernateUtil.java(略)

6. 编写测试用例

package com.bjsxt.hibernate;

 

import org.hibernate.Session;

import junit.framework.TestCase;

 

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

                     person.setIdCard(idCard);

                    

                     //不能成功保存,因为IdCardTransient状态

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

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

              }

       }           

}

一对一唯一外键关联映射_双向

       *一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:

       <one-to-one name="person" property-ref="idCard"/>

实例背景:

 

one-to-one唯一外键关联映射_双向

1. 修改IdCard

package com.bjsxt.hibernate;

 

public class IdCard {

      

       private int id;  

       private String cardNo;   

       private 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;

       }

       public Person getPerson() {

              return person;

       }

       public void setPerson(Person person) {

              this.person = person;

       }

}

2. 修改IdCard.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

       <class name="com.bjsxt.hibernate.IdCard" table="t_idcard">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="cardNo"/>

              <one-to-one name="person" property-ref="idCard"/>

       </class>

</hibernate-mapping>

3. Useruser.hbm.mxlExportDB.javaHibernateUtil.javahibernate.cfg.xml等没有变化

4. 编写测试用例

       public void testLoad() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                     //只发出一条sql语句(左外连接关联表),详见抓取策略

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

              }

       }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值