hibernate.enable_lazy_load_no_trans无法工作

3
我正在使用JPA2.1和Hibernate 4.3.8,并且我已经配置了persistence.xml以允许懒加载。
我已添加了
<property name="hibernate.enable_lazy_load_no_trans" value="true" />

进入属性部分

但我仍然遇到了LazyInitializationException,问题是什么?


该属性的格式是否与此答案相同? - Steve Chambers
是的,问题出在 Hibernate 版本上。 - Amr Khaled
3个回答

10
hibernate.enable_lazy_load_no_trans是一种反模式,您绝对不应该使用它,因为在初始持久化上下文之外获取每个延迟关联都需要数据库连接,这会给底层事务日志和JDBC连接池带来压力。

此外,hibernate.enable_lazy_load_no_trans容易出现N+1查询问题。

有时候,您甚至不需要实体,DTO投影更好。


3
"never use it" -> "尽量避免使用". 这个参数是我们使用情况下的最佳选项(最多20个用户,有一个实体图在GUI中完全显示(在选项卡、工具提示和对话框中))。 - AndrewBourgeois
在现实世界中,大多数遗留项目都存在这样的代码气味,虽然我同意你的所有观点,但你必须利用手头的资源进行工作。这个参数是一个真正的时间节省者,因为它允许我简单地将模型切换到惰性加载以提高性能。相比整个重构需要1百万字节的代码,这只需要15万字节。只读操作(生成报告时没有使用DTO,因此每次需要主实体的属性时都会急切地加载整个图形)。 - AndrewBourgeois
1
或者,如果之前的团队决定使用Hibernate来预加载所有内容,这在生产环境中运行良好,因为相同的数据被编辑过(=没有太多新记录)。问题只有在慢慢添加新记录几年后才变得明显。我绝对不会在新项目中使用该参数,但它对于旧项目非常有效。 - AndrewBourgeois
1
你的书不鼓励使用临时会话惰性加载,但并没有告诉我们永远不要使用它。这是唯一让我感到困扰的地方,因为它是我们问题的最佳(成本效益)解决方案。 - AndrewBourgeois
我的书将其描述为反模式。根据我的经验,我从未使用过任何反模式,因为这是划算的。然而,这只是我的个人经验。Spring Boot 默认使用 OSIV 反模式,因为初级开发者可能会发现理解获取策略更加困难。 - Vlad Mihalcea
显示剩余2条评论

0
尝试像这样输入“true”: true 这对我很有效。

0

org.hibernate.LazyInitializationException:

如果您正在使用getReferenceById(id)方法,请在application.properties中使用此内容。
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接