根据休眠文档:
在观察到数组不能是惰性的之后,您可以得出结论,列表、映射和 idbags 是性能最高(非逆)的集合类型
所以我的问题很简单:为什么数组不能在一对多关联中延迟加载?
延迟加载的工作原理是 Hibernate 使用可以代理的结构来了解您何时尝试访问数据。当你这样做时,这些结构会告诉 hibernate 他们现在需要加载信息,然后 Hibernate 会在你不知道发生了什么的情况下即时执行此操作。
数组不能延迟加载,因为 Hibernate 无法知道您第一次尝试访问它们,因为您无法代理“[]”运算符(aaload
字节码),Hibernate 永远不会知道什么时候您首先尝试访问它,因此它无法即时加载它。
使用集合时,您总是必须通过它们的方法访问它们,因此当您第一次尝试访问它们然后加载它们时,Hibernate 可以 100% 确定。
因此,真正的原因是无法将您的代码与数组访问运算符挂钩。字段的延迟加载也是如此,Hibernate 不能延迟加载具有仅字段访问权限的非集合属性,因为它不知道您何时尝试访问该字段,它们始终需要具有 get/set 方法访问权限。
作为如何完成此操作的示例,您可以检查PersistentList
Hibernate 上的集合,在它的indexOf
方法(以及许多其他read
方法)上调用该方法:
public int indexOf(Object value) {
read();
return list.indexOf(value);
}
最后,read
如果还没有延迟加载,该方法只会初始化集合。