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

时间:2011-02-24 19:13:05

标签: java hibernate jpa

我正在使用JPA 2和Hibernate 3.我注意到调用EntityManager.merge()会导致对象图中每个被引用实体的SELECT PLUS内部连接之间的连接。

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

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

感谢。

1 个答案:

答案 0 :(得分:5)

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

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

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

您可以尝试fetchType=LAZY ManyToOne关系(默认情况下,他们非常渴望)。