我有一个Hibernate实体,我在数据库中的某些条件下手动定义了一个Ref Integrity,它对我来说可以很好地获取目标实体。
问题是我已将该属性的FetchType定义为Lazy。理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。
答案 0 :(得分:0)
在某些情况下,即使你告诉它,hibernate也不能使用延迟加载。一种情况是持久对象的层次结构。
当您为另一个持久对象的引用指定延迟加载时,hibernate会创建一个动态代理对象,当您实际尝试访问其任何属性时,该对象只会从数据库中填充。
问题是,这个动态代理必须实现(如果你使用接口)或扩展(如果引用指向具体类)要延迟加载的类。当类是持久层次结构的超类时,hibernate不知道哪个接口是resp。要实施的课程。
实施例: 你有持久的类A,B,C,X,如下所示:
class A {}
class B extends A {}
class C extends B {}
class X {
A a;
getA() { return a;}
}
你告诉hibernate在X中使用延迟加载属性a
。
现在你想做这样的事情:
X x = ...; // load from DB
A a = x.getA();
if (a instanceof B) { ... }
else if (a instanceof C) { ... }
如果a
加载了懒惰,x.getA()
将返回动态代理。但是hibernate如何知道代理必须是B
还是C
?唯一的方法是从数据库中实际加载相关数据进行检查。因为无论如何它必须转到数据库,它不需要代理,只需加载完整的对象。