Сессия Hibernate не связана с потоком - PullRequest
0 голосов
/ 22 октября 2009

Я использую Struts + Hibernate + Spring для разработки своего проекта. А вот и мой XML-файл Spring Context. Когда в начале метода userDao.getXXXX я вызвал «sessionFactory.getCurrentSession ()», было сгенерировано исключение, подробное сообщение которого «Сеанс Hibernate не привязан к потоку, а конфигурация не позволяет создавать нетранзакционный сеанс здесь».

<!-- Hibernate Configuration -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property> 

</bean>

<!-- Spring Transaction Manager -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>    
    </property>
</bean>

<!-- Spring Transaction Descriptions -->
<bean id="transactionAttributeSource"
    class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource">
    <property name="methodMap">
        <map>
            <entry key="com.miaozhen.monitor.service.LoginServiceImpl.*">
                <value>PROPAGATION_REQUIRED</value>
            </entry>
        </map>
    </property>
</bean>

<bean id="transactionInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
        <ref bean="transactionManager"/>
    </property>
    <property name="transactionAttributeSource">
        <ref bean="transactionAttributeSource"/>    
    </property>
</bean>

<bean id="transactionAdvisor"
    class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <constructor-arg>
        <ref bean="transactionInterceptor"/>
    </constructor-arg>
</bean>

<bean id="autoproxy"
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">     
</bean>

<!-- DAO -->
<bean id="userDao"
    class="com.miaozhen.dbservice.hibernate.dao.AUserDAO">
    <property name="sessionFactory">
        <ref local="sessionFactory"/>   
    </property>
</bean>

<!-- Service Layer -->

<bean id="loginService"
    class="com.miaozhen.monitor.service.LoginServiceImpl">
    <property name="userDao">
        <ref bean="userDao"/>
    </property>
</bean>

<!-- Struts Actions for DelegatingActionProxy -->
<bean name="/login"
    class="com.miaozhen.monitor.struts.action.LoginAction">
    <property name="loginService">
        <ref bean="loginService"/>
    </property>
</bean>

1 Ответ

0 голосов
/ 22 октября 2009

Это довольно сложная конфигурация, но я подозреваю, что бин loginService почему-то не проксируется с transactionAdvisor, хотя я вижу, что вы пытаетесь это сделать.

Попробуйте убедиться, что loginService, который вводится в контроллер, на самом деле является сгенерированным прокси-объектом, а не необработанным LoginServiceImpl объектом. Отладчик также будет очень полезен для проверки того, что выполнение кода проходит через TransactionInterceptor.

Есть ли причина, по которой вы так поступаете? Есть намного более простые способы достижения того же самого, которые не включают создание советников, фабрик авто-прокси, источников атрибутов транзакций и так далее. Например, использование <tx:annotation-driven> и @Transactional облегчает эту задачу. Может быть, это потому, что ваш текущий подход означает, что в вашем коде не должно быть ссылок на Spring, это то, что вам понравилось?

...