Как я могу подключить org.springframework.transaction.interceptor.TransactionProxyFactoryBean и org.springframework.orm.hibernate3.HibernateInterceptor? - PullRequest
0 голосов
/ 27 ноября 2009

Я подключен, но он не сработал, как я ожидал. Я установил истинную ленивую инициализацию между сущностями, и HibernateInterceptor управляет сеансом гибернации. Когда я пытаюсь получить доступ к свойствам объекта, возникает исключение LazyInitializationException.

Error messgae : Transaction could not initialize proxy - the owning Session was closed

Stack Trace: org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
    at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)

Конфигурация xml

<!-- THE HIBERNATE INTERCEPTOR -->
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
    <property name="sessionFactory" ref="app:sessionFactory" />
</bean>

<!-- Start Transaction proxy definition -->

<bean id="app:appTransactionProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="app:transactionManager" />
    <property name="transactionAttributes">
        <props>
        <prop key="process*">PROPAGATION_REQUIRED,readOnly,
                -Exception,-RuntimeException</prop>
            <prop key="submit*">PROPAGATION_REQUIRED,readOnly,
                -Exception,-RuntimeException</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly,
                -Exception,-RuntimeException</prop>
        </props>
    </property>
    <property name="preInterceptors">
        <list>
            <ref bean="hibernateInterceptor" />
        </list>
    </property>
    <property name="postInterceptors">
        <list>
            <ref bean="hibernateInterceptor" />
        </list>
    </property>

</bean>


<bean id="app:daoTransactionProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="app:transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="unlock*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="getHead*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="remove*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="create*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="update*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="addTail*">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="checkForTimeouts">PROPAGATION_REQUIRED,
                -Exception,-RuntimeException</prop>
            <prop key="breakOldLocks">PROPAGATION_REQUIRES_NEW,
                -Exception,-RuntimeException</prop>
            <prop key="find*">PROPAGATION_REQUIRES_NEW,readOnly,
                -Exception,-RuntimeException</prop>
            <prop key="load*">PROPAGATION_REQUIRES_NEW,readOnly,
                -Exception,-RuntimeException</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly,
                -Exception,-RuntimeException</prop>

        </props>
    </property>
        <property name="preInterceptors">
        <list>
            <ref bean="hibernateInterceptor" />
        </list>
    </property>
    <property name="postInterceptors">
        <list>
            <ref bean="hibernateInterceptor" />
        </list>
    </property>
</bean>

<bean id="app:transactionManager" name="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="app:sessionFactory" />
    <property name="nestedTransactionAllowed" value="true" />
</bean>

    <bean id="app:sessionFactory" name="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource" ref="app:dataSource" />

    <property name="mappingResources">
        <list>
            <value>com/app/domain/app.hbm.xml</value>
            <value>com/common/domain/shared.hbm.xml</value>
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                ${app.hibernate.dialect}
            </prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.generate_statistics">false</prop>
        </props>
    </property>

    <property name="eventListeners">
        <map>
            <entry key="merge">
                <bean
                    class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
            </entry>
        </map>
    </property>
</bean>

<!--Start DATA SOURCE   -->
<bean id="app:dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <!-- Config values-->
</bean>

Есть что-нибудь по этому поводу?

1 Ответ

0 голосов
/ 27 ноября 2009

ProxyFactoryBean позволяет применять определенную логику к вызову методов бина. TransactionProxyFactoryBean IS-A ProxyFactoryBean и позволяет применять специфичные для управления транзакциями задачи.

LazyInitializationException означает, что вы получаете доступ к прокси hibernate вне активного контекста сеанса hibernate.

т.е. Вы установили инфраструктуру транзакций, попросили hibernate получить прокси для конкретной сущности и попытались получить доступ к свойствам прокси после завершения операции.

Решение состоит в том, чтобы охотно извлекать объект или работать с ним только из транзакционного контекста.

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