Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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/6/entity-framework/4.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 Hibernate fetchtype lazy正在加载目标对象(表)是否为默认值?_Java_Entity Framework_Hibernate - Fatal编程技术网

Java Hibernate fetchtype lazy正在加载目标对象(表)是否为默认值?

Java Hibernate fetchtype lazy正在加载目标对象(表)是否为默认值?,java,entity-framework,hibernate,Java,Entity Framework,Hibernate,我有一个Hibernate实体,我在数据库中的某些条件下手动定义了一个Ref完整性,它可以很好地获取目标实体 问题是我已经将该属性的FetchType定义为Lazy。因此,理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。有些情况下,hibernate不能使用延迟加载,即使您告诉它这样做。一种情况是持久对象的层次结构 当您为对另一个持久对象的引用指定延迟加载时,hibernate会创建一个动态代理对象,只有在您实际尝试访问其任何属性时,才会从数据库中填充该对象 问题是

我有一个Hibernate实体,我在数据库中的某些条件下手动定义了一个Ref完整性,它可以很好地获取目标实体


问题是我已经将该属性的FetchType定义为Lazy。因此,理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。

有些情况下,hibernate不能使用延迟加载,即使您告诉它这样做。一种情况是持久对象的层次结构

当您为对另一个持久对象的引用指定延迟加载时,hibernate会创建一个动态代理对象,只有在您实际尝试访问其任何属性时,才会从数据库中填充该对象

问题是,此动态代理必须实现(如果使用接口)或扩展(如果引用指向具体类)要延迟加载的类。当类是持久层次结构的超类时,hibernate不知道响应哪个接口。类来实现

例如: 您有持久类A、B、C、X,如下所示:

class A {}
class B extends A {}
class C extends B {}

class X {
   A a;
   getA() { return a;}
}
X x = ...; // load from DB
A a = x.getA();

if (a instanceof B) { ... }
else if (a instanceof C) { ... }
您告诉hibernate对X中的属性
a
使用延迟加载。 现在,您要执行以下操作:

class A {}
class B extends A {}
class C extends B {}

class X {
   A a;
   getA() { return a;}
}
X x = ...; // load from DB
A a = x.getA();

if (a instanceof B) { ... }
else if (a instanceof C) { ... }

如果
a
被延迟加载,
x.getA()
将返回一个动态代理。但是hibernate如何知道代理必须是a
B
还是
C
?唯一的方法是从数据库中实际加载相关数据以进行检查。而且,由于它无论如何都必须转到DB,因此它不需要代理,只需加载整个对象。

@manytone(fetch=FetchType.LAZY)@JoinColumns({@JoinColumn(name=“WK\u SUB\u LG\u CODE”,referencedColumnName=“SUBLANGUAGECODE”,updateable=false,insertable=false),@JoinColumn(name=“WK\u LG\u CODE”,referencedColumnName=“LANGUAGECODE”,updateable=false,insertable=false)})公共子语言getSubLanguageByWkLgCode(){return subLanguageByWkLgCode;}您怎么知道它也会获取映射的实体?引用的实体是持久对象层次结构的一部分,例如,是否有子类?@Mayura Nawarathne-我打开了show_sql功能,在获取父实体时,我可以看到两个select语句。@Thomastets-是的,它也有子类,并且可以是某个父对象的一部分。但问题是,我并没有获取这个被引用的对象,只是访问父对象,它仍然会加载。我将FetchType设置为Lazy。这似乎是一个条件,我正在探索更多的方法来实现它。谢谢