当前位置: 首页 > 面试题库 >

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

狄玉书
2023-03-14
问题内容

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

<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将静默忽略懒惰的属性设置,并退回立即获取。



 类似资料:
  • 我有非常复杂的冬眠结构,有许多@manytomy、@ManyToOne、@OneToOne等关联。这些嵌套的集合/对象也有自己的嵌套对象/集合。整个对象被延迟加载。 我试图实现的是,对于一个特定的操作,能够急切地获取整个对象。 我做了一些研究,但我所能找到的只是需要指定每个对象/集合并手动获取的解决方案。 有没有一种方法可以获取整个对象结构,而无需指定需要获取的每个对象?

  • 我有两个表,ComputerNode和Connection。ComputerNode有一个主键< code>nodeid,但连接没有主键。我无法修改表模式。如果它们有一对多的关系,我应该如何创建java POJO?基本上我的目标是做一个像这样的内部连接: 下面是 SQL 表架构。计算机节点表: 连接表: 表之间的关系是一对多的。一个计算机节点可以有多个连接 我已经创建了两个Java的POJO类,但

  • 根据这篇文章,我正在尝试反序列化与JooQ的一对多关联(没有代码生成)。 这是我的目标课程。 我的JooQ查询如下: 方法无法按预期工作。生成的SQL语句如下所示: 翻译后的postgres查询没有正确替换的key属性,这会导致SQL异常。 PS:我正在使用JooQ 3.14.0和postgres 11.5

  • 我的Spring数据存储库被配置为默认@RepositoryRestResources,没有任何自定义。 JPA实体: ..... 我希望House obkect以JSON格式返回,作为Flat对象的嵌入部分,但只获取House的URL /仓库/公寓/442991: 同时,User-Role OneTo多项关系被取好,角色名为: 请求:/repository/users/5 除了关系类型,我不知道

  • 1. 前言 本节课,咱们一起继续聊聊多对多关联映射。通过本节课程,你将了解到: 多对多关联映射的实现; 双向多对多关联映射的实现。 2. 多对多关联映射 首先了解表中的多对多关系,学生表中的数据和课程表中的数据就存在多对多关系。 一名学生可以选修多门课程,一门课程可以供多名学生选修。 数据库通过主外键的机制描述表中的数据之间的关系。对于存在多对多关系的数据表,借助于中间表,分拆成两个一对多(或者多