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.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...