Tôi có một ứng dụng Spring 3.2 sử dụng Hibernate 4 và Spring Transactions. Tất cả các phương thức đều hoạt động tốt và tôi có thể truy cập chính xác cơ sở dữ liệu để lưu hoặc truy xuất các thực thể. Sau đó, tôi giới thiệu một số đa luồng, và vì mỗi chủ đề được truy cập để db Tôi đã nhận được lỗi sau đây từ Hibernate:Giao dịch mùa xuân và hibernate.current_session_context_class
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
tôi đọc từ trang web mà tôi đã để thêm <prop key="hibernate.current_session_context_class">thread</prop>
để cấu hình Hibernate của tôi, nhưng bây giờ mỗi lần tôi cố gắng truy cập vào db tôi nhận được:
org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction
Tuy nhiên phương pháp dịch vụ của tôi được chú thích với @Transactional
, và tất cả đã làm việc tốt trước khi add của <prop key="hibernate.current_session_context_class">thread</prop>
.
Tại sao không có giao dịch mặc dù các phương pháp được chú thích bằng @Transactional? Làm thế nào tôi có thể giải quyết vấn đề này?
Dưới đây là cấu hình của tôi Hibernate (bao gồm cả tài sản bối cảnh phiên):
<?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"/>
Ok, tôi đã khôi phục cấu hình cũ, nhưng bây giờ, làm cách nào tôi có thể giải quyết 'org.hibernate.HibernateException: Nỗ lực bất hợp pháp liên kết bộ sưu tập với hai phiên mở' đi kèm với đa luồng? Về cơ bản tôi có chủ đề, và cả hai đều cố gắng thực hiện thao tác 'save()' trên cùng một đối tượng, chứa một bộ sưu tập. Có lẽ tôi phải tránh tình trạng này và chỉ làm một trong số họ? – user1781028
Tại sao bạn có một đối tượng duy nhất, đang được lưu bởi nhiều chuỗi. –
Ok Tôi đã xóa một trong các thao tác lưu. Nhưng nếu, vì một số lý do cụ thể, tôi thực sự cần cả hai? – user1781028