我正在使用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?
感谢。
答案 0 :(得分:5)
您正在使用分离的对象(即与会话无关的对象)调用merge(..)
。 hibernate在这里做的是 - 它从数据库中加载一个具有传递对象id的实体,并且:
在后一种情况下,涉及从DB加载,因此Hibernate需要获取整个对象。因此,许多选择。
您可以尝试fetchType=LAZY
ManyToOne
关系(默认情况下,他们非常渴望)。