我在多对一元素中声明的域对象上有一个属性。此属性的基本语法如下所示:
<many-to-one name="propertyName" class="propertyClass" fetch="select" not-found="ignore" lazy="proxy" />
现在,我们的想法是让Hibernate不急于获取此属性。它可能为null,因此设置了未找到的忽略。
但是,Hibernate在加载包含此关联的类时,会在加载父类时自行加载实际的类(甚至不是代理)实例。由于某些属性的大小超过1MB,因此它们会占用大量堆空间。
但是,如果将not-found设置为exception(或默认为exception),则具有此属性的父类会加载代理!
在仍然允许此属性为null的同时,如何停止hibernate而不加载代理?
我找到了lazy = no-proxy,但是文档讨论了某种字节码修改,并且没有涉及任何细节。有人可以帮我吗?
如果重要的话,它是Hibernate的Java版本,至少是版本3(如果有帮助,我可以查找实际版本,但现在是Hibernate 3+)。
我之前没有指定,但是Java版本是1.4。因此,不支持Java批注。
如果关联的另一端可以为 null ,我相信hibernate状态必须查询关联端以确定是否应使用代理(如果另一端为 null, 则不需要代理)。我现在找不到对此的引用,但是我记得在某处阅读过。
为了提供 字段 的延迟加载,文档参考了构建时对字段的字节码增强:使用延迟属性fetching。这是节选:
Hibernate3支持单个属性的延迟获取。此优化技术也称为获取组。请注意,这主要是一种营销功能,因为实际上,优化行读取比优化列读取更为重要。但是,在极少数情况下(旧表具有数百个列且无法改进数据模型),仅加载类的某些属性可能有用。 延迟属性加载需要构建时字节码检测!如果您的持久性类未得到增强,则Hibernate将静默忽略懒惰的属性设置,并退回立即获取。
Hibernate3支持单个属性的延迟获取。此优化技术也称为获取组。请注意,这主要是一种营销功能,因为实际上,优化行读取比优化列读取更为重要。但是,在极少数情况下(旧表具有数百个列且无法改进数据模型),仅加载类的某些属性可能有用。
延迟属性加载需要构建时字节码检测!如果您的持久性类未得到增强,则Hibernate将静默忽略懒惰的属性设置,并退回立即获取。