5

根据休眠文档

在观察到数组不能是惰性的之后,您可以得出结论,列表、映射和 idbags 是性能最高(非逆)的集合类型

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

4

1 回答 1

5

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

数组不能延迟加载,因为 Hibernate 无法知道您第一次尝试访问它们,因为您无法代理“[]”运算符(aaload字节码),Hibernate 永远不会知道什么时候您首先尝试访问它,因此它无法即时加载它。

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

因此,真正的原因是无法将您的代码与数组访问运算符挂钩。字段的延迟加载也是如此,Hibernate 不能延迟加载具有仅字段访问权限的非集合属性,因为它不知道您何时尝试访问该字段,它们始终需要具有 get/set 方法访问权限。

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

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

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

于 2012-06-17T11:11:53.937 回答