Hibernate 使用OpenSessionInviewWinterCeptor避免LazyInitializationException

Hibernate 使用OpenSessionInviewWinterCeptor避免LazyInitializationException,hibernate,spring,jpa,ejb,lazy-loading,Hibernate,Spring,Jpa,Ejb,Lazy Loading,首先,我需要承认我是EJB、JPA和Spring的新手,我认为很多事情都是错误的 我正在构建一个EJB应用程序,其中有一个无状态会话bean用于检索许多JPA(Hibernate)实体。我认为这是一个普遍存在的问题,问题是当无状态程序返回任何实例时,我无法遍历这些实体之间的关系。我遇到了一个可怕的懒洋洋的例外。在许多情况下,我发现使用急切抓取可以避免异常,但这更像是一种解决方法,而不是真正的修复方法。在谷歌搜索了很多次之后,我发现(因为我使用的是spring),实现这一点最具侵入性的方法可能是使

首先,我需要承认我是EJB、JPA和Spring的新手,我认为很多事情都是错误的

我正在构建一个EJB应用程序,其中有一个无状态会话bean用于检索许多JPA(Hibernate)实体。我认为这是一个普遍存在的问题,问题是当无状态程序返回任何实例时,我无法遍历这些实体之间的关系。我遇到了一个可怕的懒洋洋的例外。在许多情况下,我发现使用急切抓取可以避免异常,但这更像是一种解决方法,而不是真正的修复方法。在谷歌搜索了很多次之后,我发现(因为我使用的是spring),实现这一点最具侵入性的方法可能是使用OpenSessionInviewWinterCeptor

阅读看起来很容易使用,但我无法映射文章中提到的文件。一种可能的解释是,我使用的是Spring3,因此文件的名称可能已经更改。我确实有一个spring3app-servlet.xml,其中声明了bean。我还有一个web.xml,其中设置了过滤器(我相信这个文件在Spring2.0中使用过,但在3.0中仍然可以使用)

进一步的搜索让我意识到文件名不是我唯一关心的问题,因为我没有任何SessionFactorybean,我相信这是工作所必需的。这导致我搜索有关SessionFactorybean的信息

这个搜索让我意识到我可能需要.hbm.xml文件。我不确定这些文件是否真的需要,或者它们是否是遗留hibernate spring版本的必备文件

tl;医生:我想要一个OpenSessionInViewInterceptor。我需要SessionFactory Bean吗?我需要.hbm.xml文件吗?我在哪里可以找到设置此设置的所有信息

编辑:


也许解决方案是使用OpenSessionInViewFilter。我正在尝试使用它,但它仍然失败,出现相同的异常。我正在阅读寻找解决方案。

首先,如果您想要一个全面的JPA解决方案,您应该使用OpenEntityManagerViewFilter。它的功能类似于OpenSessionInViewInterceptor,但适用于JPA

至于会话bean,您将始终得到LazyInitializationException,因为对象加载在不同的会话中。惰性字段只能在当前http请求中访问。如果您在另一个http请求中访问该字段,您将获得LazyInitializationException

(顺便说一句,hibernate将http请求定义为“会话”。但是Spring会话包含多个http请求。是的,这令人困惑)

要避免LazyInitializationException,您可以执行以下操作:

  • 重新加载会话bean。例如:

    MyObject objectFromDb=objectDAO.find(objectFromSession.getId())

  • 或者在会话bean中设置字段时初始化该字段:

    Hibernate.initialize(字段)

  • (不要忘记在所有子字段上递归)


    好的,因为这是同一个会话,所以您确实需要一个OpenEntityManagerViewFilter/OpenSessionInviewWinterCeptor,它将为每个Http请求创建一个Hibernate会话。因此,请在web.xml中输入一个条目:

        <filter>
            <filter-name>JpaFilter</filter-name>
            <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>JpaFilter</filter-name>
            <url-pattern>*.jsp</url-pattern>
        </filter-mapping>
    
    
    JPA过滤器
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    JPA过滤器
    *.jsp
    

    OpenEntityManagerInViewFilter与此类似。还要确保将“entityManagerFactory”bean注入到过滤器中。

    我没有涉及多个请求,它们都在同一个请求中。这就是为什么我认为spring管理的会话应该解决我的问题。@Doppelganger我已经更新了我的答案,以反映OpenEntityManagerViewFilteri的使用。我正在努力使过滤器工作,我有很多问题。我添加了SpringORM的maven依赖项,现在我遇到了这个问题:10:55:06457错误[[/system]]异常启动筛选器OpenEntityManagerViewFilter java.lang.NoClassDefFoundError:org/springframework/dao/DataAccessResourceFailureException如果我能让它正常工作,我会向您反馈。另外,将emf注入过滤器是什么意思?@Doppelganger OpenEntityManagerInViewFilter需要emf才能正常工作。我不知道你的注入是如何完成的(aytowired by name?explicit?)只要确保过滤器已经注入了emf(它需要一个emf才能正常工作!)@Thierry Dimitri Roy我正在用@EJB注释注入它,在我用作DAO的ssb上,我不知道如何使用/如何处理过滤器,除了在web.XML中添加您给我的XML之外