8. 一对一主键关联映射

一对一主键关联映射_单向:

       * 让两个实体对象的id保持相同,这样可以避免多余的字段被创建

实例背景:

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">

                     <!--person的主键来源idCard,也就是共享idCard的主键-->

                     <generator class="foreign">

                            <param name="property">idCard</param>

                     </generator>

              </id>

              <property name="name"/>

                   <!--one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载-->

                   <!--constrained="true",表明当前主键上存在一个约束,person的主键作为外键参照了idCard-->

              <one-to-one name="idCard" constrained="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);

                    

                     //不必先save(idcard),不会出现TransientObjectException异常

                            //因为一对一主键关联映射中,默认了cascade属性

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

                    

                     //可以加载idcard对象,<one-to-one>的作用

                     Person person = (Person)session.load(Person.class, 1);

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

              }

       }                  

}

一对一主键关联映射_双向:

实例背景:

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. 修改person.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"/>

       </class>

</hibernate-mapping>

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

4. 编写测试用例

       public void testLoad2() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     IdCard idCard = (IdCard)session.load(IdCard.class, 1);

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

                     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、付费专栏及课程。

余额充值