gpt4 book ai didi

java - EntityManager.merge() 对对象图中的所有实体发出 SELECT

转载 作者:搜寻专家 更新时间:2023-11-01 02:32:51 25 4
gpt4 key购买 nike

我正在使用 JPA 2 和 Hibernate 3。我注意到调用 EntityManager.merge() 会导致对对象图中每个引用的实体以及其中一些实体之间的内部联接进行选择。

假设你想 merge() 一个 FooBar。

@Entity
public class FooBar {
@ManyToOne
private Foo foo;

@ManyToOne
private Bar bar;
}

@Entity
public class Foo {
@ManyToOne
private Baz baz;
}

@Entity
public class Bar {
@ManyToOne
private Baz baz;
}

如果这样做,Hibernate 将为 FooBar、Foo 和 Bar 中的每一个发出一个 SELECT,并为 Baz 发出两个。然后,它将为 Foo 与 Baz 连接发出一个 SELECT,另一个为 Bar 与 Baz 连接。因为我只是想合并一个 FooBar,所以我期望从中得到一个 SELECT,但我最终得到了 7 个 SELECT!

首先,这正常吗?其次,如果是,有没有办法只发出一个 SELECT?

谢谢。

最佳答案

您正在使用分离对象(即与 session 无关的对象)调用 merge(..)。 hibernate 在这里做的是 - 它从数据库中加载一个具有传递对象 ID 的实体,并且:

  • 如果没有找到记录,则插入传递的对象
  • 如果找到对象,则传输所有字段并返回持久对象

在后一种情况下,涉及从数据库加载,因此 Hibernate 需要获取整个对象。因此有很多选择。

您可以为 ManyToOne 关系尝试 fetchType=LAZY(默认情况下它们是急切的)。

关于java - EntityManager.merge() 对对象图中的所有实体发出 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5109311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com