Hibernate fetchtype lazy 正在加载目标对象(table)是默认的吗?
Hibernate fetchtype lazy is loading the target object(table) be default?
我有一个 Hibernate 实体,我在数据库中的某些条件下手动定义了一个 Ref Integrity,它可以很好地获取目标实体。
问题是我已将 属性 的 FetchType 定义为 Lazy。所以理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。
在某些情况下,hibernate 无法使用延迟加载,即使您告诉它这样做也是如此。一种情况是持久对象的层次结构。
当您为另一个持久对象的引用指定延迟加载时,hibernate 会创建一个动态代理对象,只有当您实际尝试访问它的任何属性时才会从数据库中填充它。
问题是,此动态代理必须实现(如果您使用接口)或扩展(如果引用指向具体 class)class 才能延迟加载。当 class 是持久层次结构的超级 class 时,hibernate 不知道哪个接口 resp。 class 实施。
示例:
你有持久的 classes 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()
将 return 动态代理。但是 hibernate 如何知道代理必须是 B
还是 C
?唯一的办法就是实际从数据库中加载相关数据来检查。而且由于它无论如何都必须转到数据库,所以它不会打扰代理,而只是加载完整的对象。
我有一个 Hibernate 实体,我在数据库中的某些条件下手动定义了一个 Ref Integrity,它可以很好地获取目标实体。
问题是我已将 属性 的 FetchType 定义为 Lazy。所以理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。
在某些情况下,hibernate 无法使用延迟加载,即使您告诉它这样做也是如此。一种情况是持久对象的层次结构。
当您为另一个持久对象的引用指定延迟加载时,hibernate 会创建一个动态代理对象,只有当您实际尝试访问它的任何属性时才会从数据库中填充它。
问题是,此动态代理必须实现(如果您使用接口)或扩展(如果引用指向具体 class)class 才能延迟加载。当 class 是持久层次结构的超级 class 时,hibernate 不知道哪个接口 resp。 class 实施。
示例: 你有持久的 classes 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()
将 return 动态代理。但是 hibernate 如何知道代理必须是 B
还是 C
?唯一的办法就是实际从数据库中加载相关数据来检查。而且由于它无论如何都必须转到数据库,所以它不会打扰代理,而只是加载完整的对象。