У меня есть приложение 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"/>
Хорошо, я восстановил старую конфигурацию, но теперь, как я могу решить 'org.hibernate.HibernateException: незаконная попытка связать коллекцию с двумя открытыми сеансами, которая поставляется с многопоточным? В основном у меня есть потоки, и они оба пытаются выполнить операцию 'save()' на том же объекте, который содержит коллекцию. Может быть, мне нужно избежать этой ситуации и сделать только одну из них? – user1781028
Почему у вас есть один объект, который сохраняется несколькими потоками. –
Хорошо, я удалил одну из операций сохранения. Но что, если по каким-то причинам я действительно нуждался в них обоих? – user1781028