一对一关联关系(基于外键映射和基于主键映射两种方式)

本文深入讲解了一对一关联关系在Hibernate中的实现方式,包括基于外键和基于主键的两种映射策略,并详细解释了配置文件中的关键标签及其作用。

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

终于讲到了一对一的关联关系,好了,不用再讲年级和学生的“故事”了。我们来讲讲经理和部门的故事吧。

现在存在两个这样的持久化类:

Manager:

public class Manager {
	private int mgrId;
	private String mgrName;
	private Department department;
	// 省略构造方法和set、get方法....
}

 

Department:

public class Department {
	private int depId;
	private String depName;
	private Manager manager;
	// 省略构造方法和set、get方法....
}

 

 

 

一、基于外键映射的一对一关联关系

老套路了,配置hbm文件。配置之前,我们先讨论一个问题,在这个关系中外键保存在Manager或者Department对应的数据表中是不是都可以?理论上讲是这样的,我们今天就将外键设置在Department对应的数据表中。设置外键用什么,大家也想一想,我们在之前的映射中存在外键的数据表在hbm文件中都配置了什么?是不是many-to-one标签?不要看字面意思就认为它只能用于多对一的映射,那太狭隘了。只要可以设置外键的地方都可以使用这个标签。至于限制一对一,可以添加unique唯一约束。就像下面的代码:

<many-to-one name="manager" class="Manager" column="ManagerId" unique="true"></many-to-one>

 

Manager的配置则如下:

<one-to-one name="department"  class="Department" property-ref="manager"></one-to-one>

 

property-ref需要讲一下,这是指定一对一关系的另外一个持久化类的外键对应的那个属性。翻译一下就是Department对应的数据表中的外键ManagerId对应的那个持久化类中的属性,也就是manager。有点绕,理一理还是不难理解的。如果不配置这个属性,则Manager默认参考的是Department的主键。

好了,至于方法的测试也没什么好讲的。但是事到如今,我们来小小的总结下开发中需要注意的问题。存在外键的持久化类和不存在外键的持久化类的区别。在上面的一对一关系中,Department存在外键。在查询的时候,如果查询Manager会一次性将所有的信息包括Department的数据一起查询出来,但是查询Department则会出现延迟加载(懒加载),所以后者会出现懒加载异常。保存操作时,先保存无外键的持久化类对象则会使得整个保存操作少update语句。

 

二、基于主键映射的一对一关联关系

配置hbm文件时,Manager的配置保持不变,只需要更改Department的配置即可。基于主键的映射,什么意思?主键怎么映射呢?我们可以让Department的主键生成参考Manager的主键可以吗?当然可以,Hibernate也支持这样做。基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. 然后使用<param> 子元素指定使用当前持久化类的哪个属性作为 “对方”。像下面这样:

  <id name="depId" type="int">
            <column name="DEPID" />
            <!-- 使用外键的方式来生成当前的主键 -->
            <generator class="foreign" >
            	<!-- property属性指定使用当前持久化类的哪一个属性(也是一个持久化类)的主键作为外键 -->
             	<param name="property">manager</param>
            </generator>
    </id>

 

需要注意的是:采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加constrained=“true” 属性。constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键,所以Department一端的one-to-one配置如下:

<one-to-one name="manager" class="Manager" constrained="true"></one-to-one>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值