繁体   English   中英

为什么不能在一对多关联中延迟加载数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM