2009-12-14 21 views
8

我已經閱讀過網上的各種文章,但在這一點上他們似乎相當分散。在我的配置和我的方法中,我需要做些什麼才能獲得休眠會話。我試圖做一些直接的SQL調用存儲過程。我有一個龐大的代碼庫,我正從Ruby中移植大量的靜態方法和存儲過程調用。如果我需要使用sessionFactory,那麼如何訪問它?在Grails中,我如何訪問域類靜態方法中的hibernate會話?

回答

24

從您可以從應用程序上下文拉SessionFactory的bean的靜態方法:

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

謝謝伯特。我會試一試。 – Andrew 2009-12-14 15:01:43

+8

ApplicationHolder現已被棄用,是否有更新方法? – 2013-05-30 20:07:58

+1

'import grails.util.Holders'將導入非棄用的靜態Holder,然後'Holders.grailsApplication.mainContext.sessionFactory'將給你一個sessionFactory的句柄。 – pendext 2014-11-18 17:09:27

20

如果它是一個服務或控制器,你只需要聲明SessionFactory的

高清SessionFactory的

把它注入。之後你可以參考

sessionFactory.currentSession 

要使用它。

查看hibernate-filter插件(文件HibernateFilterGrailsPlugin.groovy)瞭解如何注入一堆使用會話的方法。

+1

我專門找如何從域類靜態方法中獲取它。我不想從控制器獲取會話並將其傳遞給方法。這是1990年代' – Andrew 2009-12-14 13:41:35

+0

我試過這與Grails 2.1和會議工廠似乎沒有注入到服務。上面的伯特方法似乎仍然有效。 – 2012-08-21 16:44:52

+0

我現在在2.2.3上測試了它,它工作正常。 – 2013-12-05 20:25:37

11

您可以使用withSession

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

More info

+0

這看起來並沒有給你完整的Hibernate會話,而是一個Grails會話,這是缺少一些方法(例如'createSQLQuery') – 2014-05-21 23:21:27

+0

這似乎不是充滿真相的評論。會話不是「Grails」會話,而是Hibernate會話。很容易確定;用'println session.getClass().name'替換'session.clear()',並且很有可能在輸出中看到org.hibernate.internal.SessionImpl – 2014-11-18 17:32:32

相關問題