Hibernate fetchtype lazy是加载目标对象(表)默认的吗?

时间:2015-02-19 08:35:15

标签: java entity-framework hibernate

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

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

1 个答案:

答案 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?唯一的方法是从数据库中实际加载相关数据进行检查。因为无论如何它必须转到数据库,它不需要代理,只需加载完整的对象。