LazyInitializationException с сессионным компонентом - PullRequest
3 голосов
/ 28 мая 2009

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

Я использую 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 [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 id="currentUserBean" class="com.xxx.action.spring.CurrentUserBean" scope="session">
        <aop:scoped-proxy />    
</bean>    

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

@PersistenceContext(type=PersistenceContextType.EXTENDED) работает:)

1 голос
/ 28 мая 2009

Проверить эту тему:

Обсуждение на весеннем форуме

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

Обсуждение лучшего весеннего форума

Кажется, самое простое решение - установить lazy = "false" в вашем файле отображения hibernate, но там есть полный ответ, который позволит вам использовать LazyInitialization

0 голосов
/ 28 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...