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