2013-09-16 75 views
18

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

Trả lời

31

Khi sử dụng các giao dịch mùa xuân và mùa xuân quản lý bao giờ lộn xộn xung quanh với các hibernate.current_session_context_class tài sản TRỪ bạn đang sử dụng JTA.

Theo mặc định, mùa xuân sẽ tự thiết lập triển khai CurrentSessionContext riêng của mình (số SpringSessionContext), tuy nhiên nếu bạn tự thiết lập thì điều này sẽ không xảy ra. Về cơ bản phá vỡ tích hợp giao dịch thích hợp.

Lý do duy nhất để thay đổi cài đặt này là bất cứ khi nào bạn muốn sử dụng các giao dịch được quản lý JTA, khi đó bạn phải thiết lập điều này để tích hợp đúng với JTA.

+0

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

+1

Tại sao bạn có một đối tượng duy nhất, đang được lưu bởi nhiều chuỗi. –

+0

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

Các vấn đề liên quan