2009-12-14 31 views
8

Tôi đã đọc các bài viết khác nhau trên web, nhưng chúng dường như khá rải rác vào thời điểm này. Chính xác những gì tôi cần phải làm trong cấu hình của tôi và trong phương pháp của tôi để có được phiên ngủ đông. Tôi đang cố gắng thực hiện một số cuộc gọi sql trực tiếp cho các thủ tục được lưu trữ. Tôi có một cơ sở mã lớn mà tôi đang chuyển từ Ruby với nhiều phương thức tĩnh và các cuộc gọi thủ tục được lưu trữ. Nếu tôi cần sử dụng sessionFactory thì làm cách nào để tôi có quyền truy cập vào nó?Trong Grails làm thế nào để truy cập vào phiên ngủ đông bên trong một phương thức tĩnh lớp miền?

Trả lời

24

Từ một phương pháp tĩnh bạn có thể kéo đậu sessionfactory từ bối cảnh ứng dụng:

import org.codehaus.groovy.grails.commons.ApplicationHolder as AH 
... 
def ctx = AH.application.mainContext 
def sessionFactory = ctx.sessionFactory 
def session = sessionFactory.currentSession 
+0

Cảm ơn Burt. Tôi sẽ thử. – Andrew

+8

ApplicationHolder hiện không được chấp nhận, có phương pháp cập nhật cho điều này không? –

+1

'nhập grails.util.Holders' sẽ nhập trình giữ tĩnh không được chấp nhận và sau đó' Holders.grailsApplication.mainContext.sessionFactory' sẽ cung cấp cho bạn một xử lý trên sessionFactory. – pendext

20

Nếu đó là trong một dịch vụ hoặc điều khiển, bạn chỉ cần khai báo sessionfactory

def sessionfactory

để có nó tiêm. Sau đó, bạn có thể tham khảo

sessionFactory.currentSession 

để sử dụng.

Kiểm tra plugin bộ lọc hibernate (tệp HibernateFilterGrailsPlugin.groovy) để biết cách tiêm một loạt các phương thức sử dụng phiên.

+1

Tôi đặc biệt tìm cách lấy nó từ một phương thức tĩnh lớp miền. Tôi không muốn phải có được phiên từ bộ điều khiển và vượt qua nó vào các phương pháp. Đó là những năm 1990 ' – Andrew

+0

Tôi đã thử điều này với Grails 2.1 và nhà máy phiên dường như không được đưa vào dịch vụ. Phương pháp của Burt ở trên dường như vẫn hoạt động. –

+0

Tôi đã thử nghiệm tính năng này ngay bây giờ trên 2.2.3 và hoạt động bình thường. –

11

Bạn có thể sử dụng withSession

Book.withSession { session -> 
    session.clear() 
} 

More info

+0

Điều này dường như không cung cấp cho bạn phiên Hibernate đầy đủ, thay vào đó là phiên Grails, thiếu một số phương thức (ví dụ 'createSQLQuery ') –

+0

Đây không phải là một nhận xét đầy sự thật. Phiên không phải là phiên "Grails", đó là phiên Hibernate. Thật dễ dàng để xác định; thay thế 'session.clear()' bằng 'println session.getClass(). name' và bạn có khả năng thấy' org.hibernate.internal.SessionImpl' ở đầu ra –

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