2009-05-27 4 views
3

Je reçois LazyInitializationException avec le bean de session scoped dans ma couche de service. Si je charge le même bean en utilisant un dao normal dans ma méthode, je peux accéder à ses collections paresseuses sans problèmes. Mais si je l'injecte dans mon bean service, puis que j'essaie d'accéder à l'une de ses collections paresseuses, j'ai une exception LazyInitializationException. Je suis en train d'utiliser JPA + Hibernate + Spring + Struts. J'ai configuré OpenEntityManagerInViewFilter. De plus, je peux clairement voir dans les journaux que la transaction et la session sont ouvertes.LazyInitializationException avec le bean de session scoped

Y a-t-il quelque chose de spécial que je dois faire dans la configuration du bean de portée session avec des collections paresseuses?

Voici les journaux:

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) 

Voici les configuration du haricot:

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

Répondre

1

Vérifiez ce fil:

Spring Forum Discussion

Eh bien essayez celui-ci - vraiment la même réponse

Better Spring Forum Discussion

Semble la solution la plus simple est de mettre lazy = « false » dans votre fichier de mappage de mise en veille prolongée, mais il y a une réponse complète là-bas qui vous permettra d'utiliser LazyInitialization

+0

Merci, mais je n'utilise pas JSF. J'utilise Struts. –

0

Je pense que vous devriez avoir une portée comme demande. Raison est que votre transaction ne sera active que pour une demande non pour une session. C'est pourquoi vous voyez une exception d'initialisation paresseuse. Aussi votre doute de Transaction étant actif: Je pense que l'explication pour cela sera que UserBean a été créé dans une autre Transaction et lorsque vous accédez à une Transaction différente, sa session d'énonciation est fermée. Comme la session aurait été fermée avec First Transaction Achèvement.

1

@PersistenceContext(type=PersistenceContextType.EXTENDED) fonctionne :)

+1

où mettre cette annotation? –

Questions connexes