栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用hibernate.enable_lazy_load_no_trans解决Hibernate Lazy-Init问题

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用hibernate.enable_lazy_load_no_trans解决Hibernate Lazy-Init问题

这种方法的问题在于你可以产生N + 1效果。

假设你具有以下实体:

public class Person{    @oneToMany // default to lazy    private List<Order> orderList;}

如果你有一个返回1万个人的报告,并且在此报告中执行了代码,

person.getOrderList()
那么J
PA / Hibernate
将执行10K查询。这是N + 1效果,你将无法控制将要执行的所有查询。

现在想象一下,订单如下所示:

public class Order{    @oneToMany // default to lazy    private List<EmailSent> emailSentList;}

想象一下,现在你使用进行了一次迭代,

person.getOrderList()
并且每
Order order
做一次
order.getEmailSentList()
。现在可以看到问题了吗?

对于LazyInitializationException,你可以有一些解决方案:

  • 使用OpenInSessionInView方法。你将需要创建一个WebFilter来打开和关闭事务。问题在于N + 1效应。
  • 使用hibernate.enable_lazy_load_no_trans配置,即hibernate状态,如果需要,你将无法将项目移植到其他JPA提供程序。你还可以具有N + 1效果。
  • 使用名为PersistenceContext Extended的EJB功能。这样,你将使多个事务的上下文保持打开状态。问题是:可能发生N + 1效应,使用大量服务器内存(实体将保持托管状态)
  • 在查询中使用FETCH。使用这种方法,你可以执行JPQL / HQL,如:
    select p from Person p join fetch p.orderList
    。通过此查询,你将从数据库中加载列表,并且不会产生N + 1效果。问题是你将需要为每种情况编写一个JPQL。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432034.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号