[英]Why arrays cannot be lazy-loaded in a one-to-many assocation?
根据Hibernate文档 :
在观察到数组不能是惰性的之后 ,您可以得出结论,列表,映射和idbag是最有效的(非反向)集合类型
所以我的问题很简单:为什么不能在一对多关联中延迟加载数组?
延迟加载的工作原理是,Hibernate使用可以被代理知道的结构,从而在您首次尝试访问数据时知道这些结构。 当您执行此操作时,这些结构将告诉休眠状态,它们现在需要加载信息,然后休眠状态将即时进行,而您不知道发生了什么。
数组不能被延迟加载,因为Hibernate无法知道您是第一次尝试访问它们,因为您无法代理“ []”运算符( aaload
字节码),所以Hibernate永远不会知道当您首次尝试访问它时,它将无法即时加载。
使用集合时,您始终必须通过它们的方法来访问它们,因此,当您首次尝试访问它们然后加载它们时,Hibernate可以100%保证。
因此,真正的原因是无法将代码连接到数组访问运算符。 延迟加载字段时也会发生同样的情况,Hibernate无法延迟加载仅具有字段访问权限的非集合属性,因为当您尝试访问该字段时它不知道,它们始终需要具有get / set方法访问权限。
作为完成此操作的示例,您可以在Hibernate上检查PersistentList
集合,在其indexOf
方法(以及许多其他方法)上,调用read
方法:
public int indexOf(Object value) {
read();
return list.indexOf(value);
}
最后,如果尚未延迟加载,则read
方法将初始化该集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.