当前位置:  开发笔记 > 编程语言 > 正文

如何阻止Hibernate急切地获取多对一关联对象

如何解决《如何阻止Hibernate急切地获取多对一关联对象》经验,为你挑选了1个好方法。

我在一个域对象上有一个属性,该属性在多对一元素中声明.此属性的基本语法如下所示:


现在,我们的想法是让Hibernate不急切地获取这个属性.它可能为null,因此设置了未找到的忽略.

但是,Hibernate在加载包含此关联的类时,会在加载父类时自行加载实际的类(甚至不是代理)实例.由于某些属性的大小超过1MB,因此占用了大量的堆空间.

但是,如果not-found设置为exception(或默认为exception),则具有此属性的父类会加载代理!

如何在不加载代理的情况下阻止hibernate,同时仍然允许此属性为null?

我找到了lazy = no-proxy,但是文档讨论了某种字节码修改,并没有详细说明.有人可以帮我吗?

如果它很重要,它是Hibernate的Java版本,它至少是版本3(我可以查看实际版本,如果它有帮助,但它现在是Hibernate 3+).

我之前没有说明,但Java版本是1.4.因此,不支持Java注释.



1> Miguel Ping..:

如果关联的另一端可以为null,我相信hibernate必须查询关联端以确定它是否应该使用代理(如果另一端为null则不需要代理).我现在找不到对此的引用,但我记得在某处读过它.

为了提供字段的延迟加载,文档引用了构建时字段的字节码增强:使用延迟属性提取.这是一段摘录:

Hibernate3支持延迟提取各个属性.此优化技术也称为提取组.请注意,这主要是一种营销功能,因为在实践中,优化行读取比优化列读取更重要.但是,在极端情况下,只有加载某些类的属性才有用,因为遗留表有数百列且无法改进数据模型.

延迟属性加载需要构建时间字节码检测!如果您的持久化类没有得到增强,Hibernate将默默地忽略惰性属性设置并回退到立即获取.


我有一个类似的问题,我删除了not-found ="ignore".我没有设置lazy ="proxy",它工作正常.第19章的链接不起作用.这是正确的链接http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有