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

Tom*_*ker 4 java hibernate jpa

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,Hibernate将为FooBar,Foo和Bar发出一个SELECT,为Baz发出两个SELECT.然后,它将发出一个SELECT for Foo与Baz连接,另一个用于Bar与Baz一起加入.因为我只想合并一个FooBar,所以我期待从中获得一个SELECT,但我最终得到了一个惊人的7个SELECT!

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

谢谢.

Boz*_*zho 5

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

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

在后一种情况下,涉及到DB的加载,因此Hibernate需要获取整个对象.因此,许多选择.

您可以尝试fetchType=LAZYManyToOne关系(它们在默认情况下急于).