为了账号安全,请及时绑定邮箱和手机立即绑定

为什么JPA合并操作会导致更新前多选?

为什么JPA合并操作会导致更新前多选?

交互式爱情 2021-09-15 14:31:13
我们在 Hibernate 5.x 中使用 Spring Data 存储库我们有一个具有深层层次结构的实体图。映射如下所示:@Entitypublic class FooBar {    @OneToMany(mappedBy = "fooBar", cascade = CascadeType.ALL, orphanRemoval = true)    private Set<Foo> chassis = new HashSet<>(0);    ...}@Entitypublic class Foo {    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "foobar_id")    private FooBar fooBar;    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true)    private Set<Bar> chassis = new HashSet<>(0);    ...}@Entitypublic class Bar {    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "foo_id")    private FooBar foo;    ...}如您所见,FooBar 实体具有一组 Foo 实体。每个 Foo 实体包含更多的 Bar 实体等等。我们使用 Fetchgraph 功能在运行时加载具有我们需要的关系的 FooBar 实体,以避免在获取惰性关联时出现 n+1 查询问题。在加载实体图的服务调用之后,事务结束并且实体被分离。稍后在 FooBar 实体上调用 save 时,这会导致多个 select 语句。每个都获取一个子实体。我知道这来自 entitymanager merge() 调用,它在从分离的对象复制状态更改之前从数据库中获取对象图。我有两个问题:为什么 hibernate 不能像使用 fetchgraph 时那样将这些语句连接到一个大选择中?当我从关系中删除所有级联选项时,它仍然会导致多个选择,但只会更新顶部 FooBar 实体的属性。为什么即使没有级联合并,hibernate 仍然在合并期间获取所有加载的子实体?谢谢
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您可以使用session.update代替合并来解决此问题。


Session session = entityManager.unwrap(Session.class);


for (Post post: posts) {

    session.update(post);

}


查看完整回答
反对 回复 2021-09-15
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信