2013-09-16 2 views
18

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

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"/> 

ответ

31

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

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

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

+0

Хорошо, я восстановил старую конфигурацию, но теперь, как я могу решить 'org.hibernate.HibernateException: незаконная попытка связать коллекцию с двумя открытыми сеансами, которая поставляется с многопоточным? В основном у меня есть потоки, и они оба пытаются выполнить операцию 'save()' на том же объекте, который содержит коллекцию. Может быть, мне нужно избежать этой ситуации и сделать только одну из них? – user1781028

+1

Почему у вас есть один объект, который сохраняется несколькими потоками. –

+0

Хорошо, я удалил одну из операций сохранения. Но что, если по каким-то причинам я действительно нуждался в них обоих? – user1781028

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