Весенние транзакции и hibernate.current_session_context_class

У меня есть приложение Spring 3.2, которое использует Hibernate 4 и Spring Transactions. Все методы работали отлично, и я мог правильно обращаться к базе данных для сохранения или извлечения сущностей. Затем я ввел несколько многопоточности, и, поскольку каждый поток обращался к базе данных, я получил следующую ошибку из Hibernate:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Я прочитал из Интернета, что я должен добавить <prop key="hibernate.current_session_context_class">thread</prop> к моей конфигурации Hibernate, но теперь каждый раз, когда я пытаюсь получить доступ к БД, я получаю:

org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction

Однако мои методы обслуживания помечены @Transactionalи все работало нормально до добавления <prop key="hibernate.current_session_context_class">thread</prop>,

Почему нет транзакции, хотя методы помечены @Transactional? Как я могу решить эту проблему?

Вот моя конфигурация Hibernate (включая свойство контекста сеанса):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<!-- Hibernate session factory -->
<bean
    id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
    <property name="dataSource" >
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties" >
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop> 
            <prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>  
        </props>
    </property>   
    <property name="annotatedClasses" >
        <list>
            ...
        </list>
    </property> 
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

1 ответ

Решение

При использовании весной и весной управляемых транзакций никогда не связывайтесь с hibernate.current_session_context_class свойство, если вы не используете JTA.

Spring по умолчанию установит свой собственный CurrentSessionContext реализации ( SpringSessionContext), однако, если вы установите его самостоятельно, это не будет иметь место. В основном нарушая правильную интеграцию транзакций.

Единственная причина для изменения этого параметра - всякий раз, когда вы хотите использовать транзакции, управляемые JTA, вам необходимо настроить это для правильной интеграции с JTA.

Другие вопросы по тегам