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

时间:2012-06-17 10:56:27

标签: java hibernate jpa

根据Hibernate documentation

  

在观察到数组不能延迟之后,您可以得出结论,列表,地图和idbags是性能最高(非反向)的集合类型

所以我的问题很简单:为什么数组不能在一对多关联中延迟加载?

1 个答案:

答案 0 :(得分:5)

延迟加载的工作原理是Hibernate使用可以代理的结构来了解您何时第一次尝试访问数据。当你这样做时,这些结构将告诉hibernate他们现在需要加载信息,然后Hibernate将在运行时执行此操作,而不知道发生了什么。

数组无法延迟加载,因为Hibernate无法知道您是第一次尝试访问它们,因为您无法代理“[]”运算符(aaload字节码),Hibernate永远都不会知道你第一次尝试访问它的时候,它就无法动态加载它。

使用集合时,您总是必须通过他们的方法访问它们,因此当您第一次尝试访问它们然后加载它们时,Hibernate可以100%确定。

因此,真正的原因是没有办法将代码挂钩到数组访问运算符。对于字段的延迟加载也会发生同样的情况,Hibernate不能延迟加载非收集属性,只能访问字段,因为当您尝试访问该字段时它们不知道,它们总是需要获取/设置方法访问权限。 / p>

作为如何完成此操作的示例,您可以检查Hibernate上的PersistentList集合,在indexOf方法(以及许多其他方法)上调用read方法:

public int indexOf(Object value) {
    read();
    return list.indexOf(value);
}

最后,read方法只是初始化集合,如果它还没有延迟加载。