2009-05-27 2 views
3

Я получаю LazyInitializationException с сессионным компонентом в моем сервисе. Если я загружаю один и тот же компонент, используя обычный dao в моем методе, я могу без проблем получить доступ к его ленивым коллекциям. Но если я добавлю его в свой сервисный компонент, а затем попытаюсь получить доступ к одной из своих ленивых коллекций, у меня есть исключение LazyInitializationException.LazyInitializationException с сессионным компонентом bean

Я использую JPA + Hibernate + Spring + стойки. Я настроил OpenEntityManagerInViewFilter. Более того, я могу отчетливо видеть в журналах, что транзакция и сеанс открыты.

Есть ли что-то особенное, что я должен сделать в конфигурации для фасоли с сессионным контуром с ленивыми коллекциями?

Вот журналы:

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

ответ

1

Заканчивать эту тему:

Spring Forum Discussion

Ну тогда попробуйте этот - действительно тот же ответ

Better Spring Forum Discussion

Кажется, самое простое решение установить ленивые = «ложь» в файле отображение спящема, но есть полный ответ там, который позволит вам использовать отложенную инициализацию

+0

Спасибо, но я не использую JSF. Я использую Struts. –

0

Я думаю, что вы должны иметь объем как запрос. Причина заключается в том, что ваша транзакция будет активна только для запроса не для сеанса. Вот почему вы видите ленивое исключение инициализации.

Также вы сомневаетесь в том, что Транзакция активна: я думаю, что объяснение для этого будет заключаться в том, что UserBean был создан в какой-либо другой транзакции, и когда вы обращаетесь к какой-либо другой транзакции, ее сеанс сообщения закрыт. Поскольку сессия закрылась бы с завершением первой транзакции.

1

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

+1

где поставить аннотацию thaht? –

Смежные вопросы