Hibernate 会话作用域bean的LazyInitializationException异常

Hibernate 会话作用域bean的LazyInitializationException异常,hibernate,spring,jpa,struts,Hibernate,Spring,Jpa,Struts,在我的服务层中,我得到了会话作用域bean的LazyInitializationException。如果我在方法中使用常规dao加载相同的bean,我可以毫无问题地访问它的惰性集合。但是,如果我将它注入到我的服务bean中,然后尝试访问它的一个惰性集合,则会出现LazyInitializationException 我正在使用JPA+Hibernate+Spring+struts。我已配置OpenEntityManagerInViewFilter。此外,我可以在日志中清楚地看到事务和会话已打开

在我的服务层中,我得到了会话作用域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)
org.springframework.orm.jpa.support.OpenEntityManagerViewFilter:lookupEntityManagerFactory:146-将EntityManagerFactory“EntityManagerFactory”用于OpenEntityManagerViewFilter
org.springframework.orm.jpa.support.OpenEntityManagerViewFilter:doFilterInternal:101-在OpenEntityManagerViewFilter中打开jpa EntityManager
org.springframework.orm.jpa.JpaTransactionManager:doGetTransaction:285-找到了线程绑定的EntityManager[org.hibernate.ejb]。EntityManagerImpl@17ab5c0]对于JPA交易
org.springframework.transaction.support.AbstractPlatformTransactionManager:getTransaction:371-创建名为[com.xx.action.spring.service.SearchService.loadCurrencyCode]的新事务:传播\必需,隔离\默认,只读
org.hibernate.impl.SessionImpl::247-时间戳为5093202578464768的已打开会话
jdbctransation:begin:82-begin
ConnectionManager:openConnection:444-打开jdbc连接
org.hibernate.transaction.JDBCTransaction:begin:87-当前自动提交状态:true
JDBCTransaction:begin:90-禁用自动提交
org.springframework.orm.jpa.JpaTransactionManager:doBegin:348-将jpa事务公开为JDBC事务[SimpleConnectionHandle:com.mchange.v2.c3p0.impl。NewProxyConnection@9b537f]
org.hibernate.LazyInitializationException::42-无法初始化代理-没有会话
org.hibernate.LazyInitializationException:无法初始化代理-无会话
位于org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
位于org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
位于org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
在com.xxx.api.jpa.bean.CurrencyBean\u$$\ uJavassist\u29.getHtmlSymbol(CurrencyBean\u$$\ uJavassist\u29.java)
下面是bean的配置:

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

查看此线程:

那就试试这个——答案完全一样


似乎最简单的解决方案是在hibernate映射文件中设置lazy=“false”,但是这里有一个完整的答案,可以让您使用LazyInitialization,我认为您应该根据请求设置范围。原因是您的事务将仅对请求而不是会话处于活动状态。这就是为什么您会看到延迟初始化异常


还有,您对事务是否处于活动状态的怀疑:我认为对此的解释是,UserBean是在其他事务中创建的,当您在其他事务中访问时,它的会话将关闭。因为会话将在第一次事务完成时关闭。

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

谢谢,但我没有使用JSF。我正在使用Struts。在哪里放置注释?