2010-07-20 15 views
26

Lỗi này là gì? "Không có phiên Hibernate nào bị ràng buộc với chuỗi và cấu hình không cho phép tạo phiên không giao dịch tại đây". Tệp cấu hình mùa xuân của tôi trông giống như thế này.Không có phiên Hibernate nào bị ràng buộc với chuỗi và cấu hình không cho phép tạo phiên không giao dịch tại đây

<bean id="jndiDataSource" 
    class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:/devDS</value> 
    </property> 
</bean> 
<bean id="stsaDBFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="jndiDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>xx.yy.zz.User</value> 
      <value>xx.yy.UserResponse</value> 

     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbmddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

<!-- ################################### Aspects ################################################## --> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="stsaDBFactory" /> 
    </property> 
</bean> 

Tất cả kiểm tra DAO qua khi tôi kiểm tra chúng bên ngoài vùng chứa bằng cách sử dụng junit. Khi tôi triển khai nó trong jBoss như một ứng dụng cổng thông tin, tôi nhận được ngoại lệ này. Ngoài ra nó hoạt động tốt nếu tôi loại bỏ các cấu hình cụ thể cổng thông tin và làm cho nó một ứng dụng web đơn giản và triển khai nó trên ý tưởng jboss.Any?

+0

Xem thêm http://stackoverflow.com/questions/734614/spring-hibernate-junit-no-hibernate-session-bound-to-thread – Vadzim

Trả lời

35

Bạn đã xác định một TransactionManager trong cấu hình mùa xuân nhưng bạn đang cố gắng thực hiện truy vấn ngủ đông trong một phương thức không giao dịch. Thử thêm @Transactional vào phương thức hoặc lớp học của bạn.

+1

Chỉ là truy vấn chọn lọc của nó. Tôi có phải thêm chú thích này vào tất cả các phương pháp DAO không? – chedine

+0

Nó có thể được trên phương pháp DAO hoặc trên phương pháp dịch vụ hoặc trên một trong các lớp, nhưng nó phải ở đâu đó trong ngăn xếp nếu bạn đang sử dụng một TransactionManager hoặc bạn sẽ nhận được ngoại lệ bạn gặp phải vì bạn đang cố gắng chạy truy vấn bên ngoài giao dịch. – rjsang

+0

Làm cách nào một số người đang làm việc mà không có chú thích này? – chedine

4

Tôi gặp vấn đề này bằng cách chỉ định current_session_context_class trong hibernate config thành "thread", theo cấu hình đơn giản được hiển thị trong hibernate configuration documentation.

Nhưng đề xuất không an toàn cho việc sử dụng sản xuất.

Cố gắng thêm những điều sau đây bạn hibernate config cũng nên giúp đỡ:

<property name="current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property> 

Check-out http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/architecture.html#architecture-current-session để biết thêm chi tiết.

+1

Chỉ là một cảnh báo cho những người dùng thử điều này và đang sử dụng Spring: Tôi vừa gặp một lỗi khác khi cấu hình 'current_session_context_class'. Trong một số câu hỏi khác, điều này đã đưa ra các vấn đề với các giao dịch. Hiệu quả điều này dường như loại bỏ quản lý giao dịch mùa xuân. (xem ví dụ: http://stackoverflow.com/questions/4293098/how-to-integrate-spring-with-hibernate-session-and-transaction-management) – Yashima

+0

Tôi cũng có hành vi khác. Tôi đã tải một đối tượng từ cơ sở dữ liệu, thực hiện một thay đổi, sau đó cố gắng giữ nó. Để nó hoạt động, tôi phải đuổi nó ra khỏi phiên rồi lưu lại. – Zoidberg

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