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

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

宋飞舟
2023-03-14
问题内容

我一直在遭受着 hibernate异常

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

现在社区正在欢呼

<property name="hibernate.enable_lazy_load_no_trans" value="true"/>

说它可以解决问题,但请谨慎使用。

他们谨慎使用意味着什么?此属性实际上是做什么的?

请给我任何见解。提前致谢。


问题答案:

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

假设你具有以下实体:

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

如果你有一个返回1万个人的报告,并且在此报告中执行了代码,person.getOrderList()那么JPA / 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。


 类似资料:
  • 本文向大家介绍使用angularjs.foreach时return的问题解决,包括了使用angularjs.foreach时return的问题解决的使用技巧和注意事项,需要的朋友参考一下 AngularJS中当我们需要遍历某个数组的时候,我们会用到forEach语法。AngularJS中forEach的用法如下: array表示需要遍历的数组,obj表示遍历时的每个元素,index表示遍历时元素的

  • 我们试图通过Spring4.x创建Solace JMS连接,但在运行main类时面临以下问题。 还可以找到附加的spring-context文件,用于Solace服务器配置。 谢谢 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jms http:/

  • 本文向大家介绍React 使用browserHistory项目访问404问题解决,包括了React 使用browserHistory项目访问404问题解决的使用技巧和注意事项,需要的朋友参考一下 最近项目里面用到了React但是发布到iis站点之后,路由地址 刷新访问直接404错误。查阅资料之后发现是iis缺少配置URL重写 的问题导致的。下面我们来图形化配置,简单的配置下IIS 打开IIS使用

  • 本文向大家介绍详解解决jupyter不能使用pytorch的问题,包括了详解解决jupyter不能使用pytorch的问题的使用技巧和注意事项,需要的朋友参考一下 问题: 昨天在使用jupyter时,发现pytorch又不能用了,之前用了很久的时间安装上,最近一直在用pycharm,转而用jupyter时,发现又开始像之前一样报错,提示:no module named ‘torch'。 尝试各种方

  • 我们已经探索了 Python 语言中的许多部分,现在我们将通过设计并编写一款程序来了解如何把这些部分组合到一起。这些程序一定是能做到一些有用的事情。这其中的方法就是去学习如何靠你自己来编写一份 Python 脚本。 问题 我们希望解决的问题如下: 我想要一款程序来备份我所有的重要文件。 虽然这是一个简单的问题,但是其中并没有足够的信息有助于让我们开始规划一份解决方案。我们需要进行一些分析(Anal

  • 我正在尝试使用Cloudfront HLS功能设置视频流,但在获取HLS时遇到了问题。js在请求中发送我的凭据cookie。 我已经将Cloudfront配置为转发Cookie和转发访问控制头。我还将我的S3 CORS策略设置为包括GET、HEAD。 我遇到的问题是,即使我设置了xhr.withCredentials=true,并且在会话中定义了cookie,当我使用chrome控制台查看请求时,