繁体   English   中英

Hibernate JPA,Spring MVC和LazyInitializationException

[英]Hibernate JPA, Spring MVC and LazyInitializationException

当尝试从数据库获取项目时,出现此错误:

13:00:13.876 [7838526@qtp-204712603-0] ERROR o.h.LazyInitializationException - failed to lazily initialize a collection of role: bo.myobj, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.myob.linkedstuff, no session or session was closed

我知道切换到eager而不是lazy loading可以解决此问题,例如

@OneToMany(mappedBy = "myobj", cascade = CascadeType.ALL, fetch=FetchType.EAGER)

而且我也明白不鼓励急于加载。 为了解决这个问题,最佳实践是什么?

我很确定在没有活动交易时会发生这种情况。

阅读有关声明式事务管理的春季参考部分。

如果使用批注或<tx:advice>正确xml配置,通常会归结为需要@Transactional批注的服务方法或类。

这是一个常见问题,通常是由休眠Session关闭后呈现视图引起的。 常见的解决方案是使用“ 在视图中打开会话”模式,该模式将在Web请求的整个生命周期中保持休眠会话的打开状态。

Spring带有实现此模式的过滤器 例如,要为您的应用程序中的所有JSP文件启用它,请将类似以下内容添加到您的web.xml

<filter>
    <filter-name>osivFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>osivFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

持久层和其他层之间的更好隔离。 确保持久层产生的对象不包含对Hibernate的任何引用。

休眠,摆脱我的POJO! 可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM