Java EntityManager.merge()对对象图中的所有实体发出SELECT
我正在使用JPA2和Hibernate3。我注意到,调用EntityManager.merge会导致对对象图中的每个引用实体进行选择,以及其中一些实体之间的内部联接 假设您要合并一个FooBarJava EntityManager.merge()对对象图中的所有实体发出SELECT,java,hibernate,jpa,Java,Hibernate,Jpa,我正在使用JPA2和Hibernate3。我注意到,调用EntityManager.merge会导致对对象图中的每个引用实体进行选择,以及其中一些实体之间的内部联接 假设您要合并一个FooBar @Entity public class FooBar { @ManyToOne private Foo foo; @ManyToOne private Bar bar; } @Entity public class Foo { @ManyToOne
@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连接)和另一个for Bar(与Baz连接)。因为我只是想合并一个FooBar,所以我希望从中选择一个选项,但我最终得到了7个选项
首先,这正常吗?第二,如果是的话,有没有办法只发行一张精选票
谢谢。您正在拨打merge。。使用分离的对象,即与会话无关的对象。hibernate在这里所做的是—它从数据库加载一个具有传递对象id的实体,并且:
如果未找到记录,则插入传递的对象
如果找到对象,则传输所有字段并返回持久对象
在后一种情况下,需要从数据库加载,因此Hibernate需要获取整个对象。因此,许多选择
您可以尝试fetchType=LAZY来处理默认情况下需要的多通关系