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

我们在 Hibernate 5.x 中使用 Spring Data 存储库


我们有一个具有深层层次结构的实体图。映射如下所示:


@Entity

public class FooBar {

    @OneToMany(mappedBy = "fooBar", cascade = CascadeType.ALL, orphanRemoval = true)

    private Set<Foo> chassis = new HashSet<>(0);


    ...

}


@Entity

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


    ...

}


@Entity

public 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 仍然在合并期间获取所有加载的子实体?


谢谢


交互式爱情
浏览 145回答 1
1回答

杨魅力

您可以使用session.update代替合并来解决此问题。Session session = entityManager.unwrap(Session.class);for (Post post: posts) {&nbsp; &nbsp; session.update(post);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java