【问题标题】:EntityManager.merge() issues SELECT's on all entities in the object graphEntityManager.merge() 在对象图中的所有实体上发出 SELECT
【发布时间】:2011-02-24 19:13:05
【问题描述】:

我正在使用 JPA 2 和 Hibernate 3。我注意到调用 EntityManager.merge() 会在对象图中的每个引用实体上产生一个 SELECT 以及其中一些实体之间的内部连接。

假设你想合并()一个 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 发出两个。然后,它将发出一个 SELECT 用于与 Baz 连接的 Foo 和另一个用于与 Baz 连接的 Bar。因为我只是想合并一个 FooBar,所以我期待它有一个 SELECT,但我最终得到了 7 个 SELECT!

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

谢谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

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

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

    您可以尝试fetchType=LAZYManyToOne 关系(默认情况下它们是渴望的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多