Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager.merge()对对象图中的所有实体发出SELECT_Java_Hibernate_Jpa - Fatal编程技术网

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

Java 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

我正在使用JPA2和Hibernate3。我注意到,调用EntityManager.merge会导致对对象图中的每个引用实体进行选择,以及其中一些实体之间的内部联接

假设您要合并一个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连接)和另一个for Bar(与Baz连接)。因为我只是想合并一个FooBar,所以我希望从中选择一个选项,但我最终得到了7个选项

首先,这正常吗?第二,如果是的话,有没有办法只发行一张精选票

谢谢。

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

如果未找到记录,则插入传递的对象 如果找到对象,则传输所有字段并返回持久对象 在后一种情况下,需要从数据库加载,因此Hibernate需要获取整个对象。因此,许多选择

您可以尝试fetchType=LAZY来处理默认情况下需要的多通关系