具有会话范围bean的LazyInitializationException

时间:2009-05-27 21:51:53

标签: hibernate spring jpa struts

我在服务层中使用会话范围的bean获取LazyInitializationException。如果我在我的方法中使用常规dao加载相同的bean,我可以毫无问题地访问它的惰性集合。但是如果我将它注入我的服务bean,然后尝试访问其中一个惰性集合,我就有一个LazyInitializationException。

我正在使用JPA + Hibernate + Spring + struts。我已经配置了OpenEntityManagerInViewFilter。此外,我可以在日志中清楚地看到交易和会话已经打开。

在使用延迟集合的会话范围bean的配置中,我是否需要做一些特别的事情?

以下是日志:

    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:lookupEntityManagerFactory:146 - Using EntityManagerFactory 'entityManagerFactory' for OpenEntityManagerInViewFilter
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter:doFilterInternal:101 - Opening JPA EntityManager in OpenEntityManagerInViewFilter
    org.springframework.orm.jpa.JpaTransactionManager:doGetTransaction:285 - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@17ab5c0] for JPA transaction
    org.springframework.transaction.support.AbstractPlatformTransactionManager:getTransaction:371 - Creating new transaction with name [com.xx.action.spring.service.SearchService.loadCurrencyCode]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
    org.hibernate.impl.SessionImpl:<init>:247 - opened session at timestamp: 5093202578464768
    org.hibernate.transaction.JDBCTransaction:begin:82 - begin
    org.hibernate.jdbc.ConnectionManager:openConnection:444 - opening JDBC connection
    org.hibernate.transaction.JDBCTransaction:begin:87 - current autocommit status: true
    org.hibernate.transaction.JDBCTransaction:begin:90 - disabling autocommit
    org.springframework.orm.jpa.JpaTransactionManager:doBegin:348 - Exposing JPA transaction as JDBC transaction [SimpleConnectionHandle: com.mchange.v2.c3p0.impl.NewProxyConnection@9b537f]
    org.hibernate.LazyInitializationException:<init>:42 - could not initialize proxy - no Session
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
        at com.xxx.api.jpa.bean.CurrencyBean_$$_javassist_29.getHtmlSymbol(CurrencyBean_$$_javassist_29.java)

以下是bean的配置:

<bean id="currentUserBean" class="com.xxx.action.spring.CurrentUserBean" scope="session">
        <aop:scoped-proxy />    
</bean>    

3 个答案:

答案 0 :(得分:1)

查看此主题:

Spring Forum Discussion

那么试试这个 - 真是一样的答案

Better Spring Forum Discussion

似乎最简单的解决方案是在你的hibernate映射文件中设置lazy =“false”,但是有一个完整的答案可以让你使用LazyInitialization

答案 1 :(得分:1)

@PersistenceContext(type=PersistenceContextType.EXTENDED)有效:)

答案 2 :(得分:0)

我认为你应该有范围作为要求。原因是您的交易仅对请求而非会话有效。这就是为什么你看到懒惰的初始化异常。

此外,您对交易处于活跃状态的疑问:我认为对此的解释是UserBean是在其他一些交易中创建的,当您在某个不同的交易中访问时,其说会话已关闭。会议将在第一次交易完成时结束。