2009-12-14 50 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