2009-05-27 92 views
3

我得到LazyInitializationException和服务层中的会话作用域bean。如果我在我的方法中使用常规dao加载相同的bean,则可以毫无问题地访问它的懒集合。但是,如果我将它注入到服务bean中,然后尝试访问它的一个懒惰集合,那么我有一个LazyInitializationException。LazyInitializationException和会话作用域bean

我正在使用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 [[email protected]] 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: [email protected]] 
    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>  

回答

1

退房此线程:

Spring Forum Discussion

那好吧,试试这个 - 真的是一样的答案

Better Spring Forum Discussion

似乎最简单的办法是设置为lazy =“假”在Hibernate映射文件,但有一个完整的答案存在,这将允许您使用惰性初始模式

+0

谢谢,但我没有使用JSF。我正在使用Struts。 – 2009-05-27 22:00:13

0

我想你应该有范围就像要求的一样。原因是您的交易仅适用于非会话请求。这就是为什么你看到懒惰的初始化异常。

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

1

@PersistenceContext(type=PersistenceContextType.EXTENDED)作品:)

+1

在哪里放注释? – 2010-11-24 02:54:52