在一对多关系中使用双向关联的好处

本文介绍如何通过双向关联和正确配置解决Hibernate一对多关联时产生的效率问题及非空约束违反问题。

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

[size=13]假设我们要实现一个简单的从Parent到Child的<one-to-many>关联。 [/size]

如果在使用单向一对多关联,即只在Parent方配置关联。
[code]<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
[/code]
如果我们运行下面的代码
[code]Parent p = .....;
Child c = new Child();
p.getChildren().add(c);
session.save(c);
session.flush();
[/code]
Hibernate会产生两条SQL语句:

一条INSERT语句,为c创建一条记录

一条UPDATE语句,创建从p到c的连接

这样做不仅效率低,而且违反了列parent_id非空的限制。我们可以通过在集合类映射上指定not-null="true"来解决违反非空约束的问题:

这种现象的根本原因是从p到c的连接(外键parent_id)没有被当作Child对象状态的一部分,因而没有在INSERT语句中被创建。因此解决的办法就是把这个连接添加到Child的映射中。
在Child的配置文件中加入
[code]<many-to-one name="parent" column="parent_id" not-null="true"/>[/code]
(我们还需要为类Child添加parent属性)
使之变为双向的一对多关系

现在实体Child在管理连接的状态,为了使collection不更新连接,我们使用inverse属性。
[code]<set name="children" inverse="true">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>[/code]

下面的代码是用来添加一个新的Child
[code]Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();[/code]
现在,只会有一条INSERT语句被执行!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值