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

前端之家收集整理的这篇文章主要介绍了java – 如何阻止Hibernate急切地获取多对一的关联对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在一个域对象中有一个属性,它被声明在一个多对一的元素中.该属性的基本语法如下所示:
<many-to-one name="propertyName" class="propertyClass" fetch="select" not-found="ignore" lazy="proxy" />

现在,这个想法是让Hibernate不急于获取这个属性.它可能为null,因此未设置的ignore被设置.

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

然而,如果未找到异常(或默认为异常),则具有此属性父类将加载代理!

如何停止hibernate不加载代理,同时仍然允许此属性为空?

我发现lazy = no-proxy,但是文档谈到某种字节码修改,并没有详细介绍.有人可以帮我吗?

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

我以前没有指定,但是Java版本是1.4.因此,Java注释不受支持.

解决方法

如果关联的另一端可以为空,我相信hibernate必须查询关联结束,以确定它是否应该使用代理(不需要代理,如果另一端为空).我现在找不到这个参考,但我记得在某处读书.

为了提供延迟加载的字段,文档引用了在buildtime:Using lazy property fetching的字段的字节码增强.这是一个摘录:

Hibernate3 supports the lazy fetching
of individual properties. This
optimization technique is also known
as fetch groups. Please note that this
is mostly a marketing feature,as in
practice,optimizing row reads is much
more important than optimization of
column reads. However,only loading
some properties of a class might be
useful in extreme cases,when legacy
tables have hundreds of columns and
the data model can not be improved.

Lazy property loading requires buildtime bytecode instrumentation! If your persistent classes are not enhanced,Hibernate will silently ignore lazy property settings and fall back to immediate fetching.

猜你在找的Java相关文章