Hibernate学习12 -- 关联映射2 -- 一对一关联1 -- 一对一主键关联

本文介绍了一对一主键关联映射的概念及其在Hibernate框架中的应用方式,包括配置文件的具体写法及测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对一关联表示两个对象之间是一对一的关系,如Person-IdCard。有两种策略可以实现一对一的关联映射:

Ø 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联;

Ø 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建。

clip_image002

具体映射:

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

步骤:

n         建立POJO类:IdCard.javaPerson.java, 建立Hibernate配置文件,将两个hbm文件与其绑定。

n         Person.java里面建立一个IdCard类型的属性

n         Personhbm文件中添加:

<one-to-one name="idCard" constrained="true"/>

 

n         代码实现:

IdCard.java

public class IdCard {

    private int id;

    private String cardNo;

Person.java

public class Person {

    private int id;

    private String name;

    private IdCard idCard;

IdCard.hbm.xml

<hibernate-mapping>

    <class name="IdCard" table="t_idcard">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="cardNo"/>

    </class>

</hibernate-mapping>

Person.hbm.xml

<hibernate-mapping>

    <class name="Person" table="t_person">

       <id name="id">

           <generator class="foreign">

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

           </generator>

       </id>

       <property name="name"/>

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

           Person person = new Person();

           person.setName("张三");

           person.setIdCard(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();       

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

       }

    }     

   

}

hibernate一对一主键关联映射(双向关联Person<---->IdCard

需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person,默认根据主键加载。

步骤基本与单向一直,只需在IdCard.java加入Person对象的引用,并在IdCard.hbm.xml加入<one-to-one>标签,相应代码如下:

IdCard.java加入

    private Person person;

IdCard.hbm.xml加入:

    <one-to-one name="person"/>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值