我一直在遭受着 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效果,你将无法控制将要执行的所有查询。
person.getOrderList()
PA / Hibernate
现在想象一下,订单如下所示:
public class Order{ @OneToMany // default to lazy private List<EmailSent> emailSentList; }
想象一下,现在你使用进行了一次迭代,person.getOrderList()并且每Order order做一次order.getEmailSentList()。现在可以看到问题了吗?
Order order
order.getEmailSentList()
对于LazyInitializationException,你可以有一些解决方案:
select p from Person p join fetch p.orderList