【问题标题】:Hibernate JPA, Spring MVC and LazyInitializationExceptionHibernate JPA、Spring MVC 和 LazyInitializationException
【发布时间】:2010-07-24 11:10:39
【问题描述】:

尝试从 db 获取项目时,我收到此错误:

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

我知道切换到急切而不是延迟加载可以解决这个问题,例如

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

而且我也理解不鼓励急切加载。解决此问题的最佳做法是什么?

【问题讨论】:

    标签: java hibernate spring jpa spring-mvc


    【解决方案1】:

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

    阅读关于Declarative Transaction Management的spring参考部分

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

    【讨论】:

    • 抱歉,我检查了所有的 bean - @Transactional 存在于所有 DAO 方法中......我的 xml 看起来也很好
    • 感谢您的投票。我的意思是:当您访问集合时,您是否仍在事务范围内?因为这可能不会发生在 dao 方法中,是吗?
    【解决方案2】:

    这是一个常见的问题,通常是在休眠Session关闭后渲染视图引起的。一个常见的解决方案是使用Open Session In View 模式,这将使休眠会话在网络请求的整个生命周期内保持打开状态。

    Spring 带有实现此模式的filter。例如,要为应用程序中的所有 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>
    

    【讨论】:

    • 我插入了这些行,但是,laziiniterror 仍然存在 :-(
    【解决方案3】:

    更好地分离持久层和其他层。确保持久层生成的对象不包含对 Hibernate 的任何引用。

    Hibernate, Get Out of My POJO! 的文章可能会有所帮助。

    【讨论】:

    • 感谢您的提示,我想这是正确的策略。但是,自从我开始使用 ORM 以来,我遇到了很多问题,我想知道使用 any ORM 是否有任何好处......对不起,只是 不得不提到:-(
    • @erlord:请随意不要使用 ORM(至少不要使用具有已定义持久性上下文的 ORM)然后 :) 祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2015-05-31
    • 2012-12-28
    • 2011-12-21
    • 2017-08-22
    相关资源
    最近更新 更多