为了账号安全,请及时绑定邮箱和手机立即绑定

使用JPA和Hibernate时如何解决LazyInitializationException

使用JPA和Hibernate时如何解决LazyInitializationException

千万里不及你 2019-12-25 10:41:54
我正在为一个想要使用延迟初始化的客户开发项目。当使用默认的延迟加载模式映射类时,它们始终会获得“延迟初始化异常”。@JoinTable(name = "join_profilo_funzionalita", joinColumns = {@JoinColumn(name =    "profilo_id", referencedColumnName = "profilo_id")}, inverseJoinColumns = {@JoinColumn(name = "funzionalita_id", referencedColumnName = "funzionalita_id")})//@ManyToMany(fetch=FetchType.EAGER) - no exceptions if uncommented@ManyToMany private Collection<Funzionalita> funzionalitaIdCollection;是否有使用JPA类的标准模式来避免此错误?欢迎您摘录,非常感谢您的宝贵时间。
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

有很多预取属性的方法,因此在关闭会话后就可以使用它们:

  1. 呼叫适当的吸气剂。在将字段提取到bean中之后,在关闭会话之后它在那里。

  2. 您可以在EJBQL查询中初始化字段,寻找JOIN FETCH关键字。

  3. 如果您使用的是支持Hibernate的版本,请启用AvailableSettings.ENABLE_LAZY_LOAD_NO_TRANS。

当您尝试这些解决方案时,可能会出现几个问题:

  1. 通过JIT编译器可以优化getter的调用(有时需要一段时间)。

  2. 您尝试建立的实体JOIN FETCH可能通过涉及List的多个“许多”关系进行链接。在这种情况下,结果查询将返回模糊的结果,并且Hibernate将拒绝在单个查询中获取您的数据。

  3. 已经存在一个与AvailableSettings.ENABLE_LAZY_LOAD_NO_TRANS相关的有趣错误。还会有更多的原因,因为正如冬眠的家伙所说:注意:这可能在交易之外发生,并且不安全。请谨慎使用。您主要是自己一个人。

最好的方法是先尝试JOIN FETCH。如果那不起作用,请尝试使用吸气剂方法。如果JIT编译器在运行时将其弄乱了,请将结果分配给public static volatile Object

或停止使用Hibernate ...


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 610 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信