2015-02-20 32 views
5

Tôi đã sử dụng quản lý giao dịch có lập trình vào mùa xuân, bây giờ tôi đã chuyển sang quản lý giao dịch khai báo.mùa xuân Quản lý giao dịch không hoạt động

SessionFactory

<beans:bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="dataSource" /> 
     <beans:property name="packagesToScan" value="com.hcentive.cig.domain" /> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
       </beans:prop> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
       <beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 
      </beans:props> 
     </beans:property> 
    </beans:bean> 

TransactionManager

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

Bây giờ Nếu chạy mã của tôi

@Override 
    @Transactional 
    public Request saveRequest(Request request) { 
     sessionFactory.getCurrentSession().save(request); 
     return request; 
    } 

tôi nhận được ngoại lệ tiết kiệm là không hợp lệ mà không có một giao dịch tích cực

nếu tôi loại bỏ dưới dòng

<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 

tôi nhận được

Không CurrentSessionContext cấu hình!

+2

Bạn có '' –

+0

có một cái nhìn vào những câu trả lời: http://stackoverflow.com/a/4396530/280244 – Ralph

+0

[Xem ở đây] (http: // stackoverflow.com/a/25910635/3364187) – Xstian

Trả lời

1

Bạn chắc chắn không cần phải cài đặt này:

<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop> 

lớp Quản lý giao dịch mùa xuân nên ràng buộc Hibernate Session để chạy hiện tại Chủ đề.

Các thiết lập cũng tốt, điều duy nhất mà có thể gây ra nó xuất phát từ tuyên bố này của bạn:

không có nó là nhận được gọi từ lớp dịch vụ, và tôi cũng đã cố gắng di chuyển @ giao dịch để phục vụ lớp

Bạn cần phải phơi bày phương pháp này:

Request saveRequest(Request request); 

thông qua một giao diện dịch vụ, mà bạn tiêm vào bất kỳ thành phần nào khác (web hoặc các bean lớp dịch vụ khác).

Để xác thực điều này, bạn có thể đặt điểm ngắt lỗi trong triển khai phương pháp saveRequest và tìm kiếm ngăn xếp cuộc gọi TransactionInterceptor. Nếu nó không có ở đó, thì Spring không thể kết thúc cuộc gọi phương thức của bạn vào một logic xử lý giao tác Aspect.

0

Có chức năng của bạn được chú thích vì Giao dịch không nhất thiết là đủ. Bạn cũng cần phải đảm bảo rằng:

  • đậu của bạn được tạo ra thông qua mùa xuân (được định nghĩa như @Component và tìm thấy qua componentScan HOẶC tuyên bố trong cấu hình xml)
  • Các tài liệu tham khảo để đậu của bạn cần phải được lấy thông qua dependency injection mùa xuân
1

Đối với @Transactional để có hiệu quả, bạn phải cho biết bối cảnh mùa xuân mà bạn muốn sử dụng. Chú thích không có bộ xử lý cho chú thích đó là khá vô ích.Để bật bộ xử lý cho chú thích @Transactional thêm <tx:annotation-driven /> vào ngữ cảnh của bạn. (Như được giải thích here trong hướng dẫn tham khảo).

Cấu hình ngủ đông của bạn cũng gặp sự cố khi sử dụng Spring bạn không nên lộn xộn với thuộc tính cấu hình hibernate.current_session_context_class (trừ khi bạn sử dụng một số nhà cung cấp JTA cụ thể nhưng dường như bạn không có). Nếu bạn bắt đầu thiết lập thuộc tính đó, bạn sẽ phá vỡ tích hợp mùa xuân thích hợp để quản lý giao dịch. Mùa xuân đã đặt thuộc tính đó cho bạn và cài đặt của bạn sẽ ghi đè cài đặt mặc định.

Cấu hình của bạn sẽ trông giống như thế này.

<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="com.hcentive.cig.domain" /> 
    <beans:property name="hibernateProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop> 
      <beans:prop key="hibernate.show_sql">true</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

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

<tx:annotation-driven /> 
Các vấn đề liên quan