2012-02-08 23 views
7

Điều gì đã xảy ra với phương thức SessionFactoryUtils.getSession từ Hibernate 4 trong Spring 3.1.0? Những gì nên được sử dụng thay thế? sessionFactory.getCurrentSession() giữ cho tôi ngoại lệ này:Mùa xuân: Tại sao lớp SessionFactoryUtils trong Hibernate 4 không cung cấp phương thức getSession?

org.hibernate.HibernateException: No Session found for current thread 
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:883) 

Bất kỳ gợi ý nào?

+1

Tôi đang đối mặt với cùng một vấn đề, tôi đang sử dụng sessionFactory.getCurrentSession() thay vào đó, nhưng tôi không chắc chắn nếu nó là đúng cách để đi. – craftsman

Trả lời

0

Không chắc chắn lý do tại sao họ xóa nó, có thể họ đã triển khai thiết kế tốt hơn bằng cách sử dụng org.hibernate.context.CurrentSessionContext. Kể từ this post:

... Đơn giản chỉ cần sử dụng SessionFactory đồng bằng và sử dụng phương pháp getCurrentSession để có được những phiên giao dịch hiện tại (không sử dụng openSession !!!!) và bạn tốt để đi ..

Kể từ documentation of SessionFactory.getCurrentSession()

:

The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use. 
+0

trong bài đăng của marten, từ khóa là "phiên * giao dịch * hiện tại". Vì vậy, gastaldi phải thiết lập phân giới giao dịch như tôi mô tả trong câu trả lời của tôi –

0

Các 'org.hibernate.HibernateException: No Session found for current thread' ngoại lệ xảy ra khi bạn đã không được cấu hình demarcat giao dịch của bạn. ion đúng với mùa xuân.

Thông thường, Spring sẽ mở phiên cho bạn khi giao dịch của bạn bắt đầu, liên kết nó với ThreadLocal và tái sử dụng nó trong suốt thời gian giao dịch của bạn. Khi giao dịch của bạn cam kết, phiên sẽ bị đóng (sau khi nó đã được xóa). Vì vậy, bạn không cần phải thực hiện bất kỳ cuộc gọi nào cho chính lớp học SessionFactory.

Thông thường, mọi người đặt @Transactional vào một lớp (thường là Dịch vụ) và configure Spring to start and end transactions on method invocations trên lớp đó.

0

Bạn cần phải thêm một ví dụ tài sản:

<prop key="hibernate.current_session_context_class">thread</prop>

để lập bản đồ đậu nhà máy phiên của bạn. (Kiểm tra tài liệu Hibernate để biết thêm chi tiết)

3

Sử dụng sessionFactory.getCurrentSession()

Tôi tin rằng khái niệm về một "phiên hiện tại" bước vào Hibernate 3, SessionFactoryUtil đã được viết trước khi điều này tồn tại.

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