在Grails中如何在域类静态方法中访问hibernate会话?

And*_*rew 9 grails hibernate sessionfactory

我在网上看过各种各样的文章,但在这一点上它们似乎相当分散.在我的配置和我的方法中,我需要做什么才能获得hibernate会话.我正在尝试为存储过程进行一些直接的SQL调用.我有一个很大的代码库,我从Ruby移植了很多静态方法和存储过程调用.如果我需要使用sessionFactory,那么如何才能访问它?

Bur*_*ith 26

从静态方法中,您可以从应用程序上下文中提取sessionFactory bean:

import org.codehaus.groovy.grails.commons.ApplicationHolder as AH
...
def ctx = AH.application.mainContext
def sessionFactory = ctx.sessionFactory
def session = sessionFactory.currentSession
Run Code Online (Sandbox Code Playgroud)

  • ApplicationHolder现已弃用,是否有更新方法? (8认同)
  • `import grails.util.Holders` 将导入未弃用的静态 Holder,然后 `Holders.grailsApplication.mainContext.sessionFactory` 将为您提供 sessionFactory 的句柄。 (2认同)
  • 避免"持有人".仅仅因为它没有被弃用并不意味着你应该使用它.实际上,它与`ApplicationHolder`和其他人一样具有_exactly_相同的问题,并且也应该被弃用和删除.如果您正在寻找的是当前的Hibernate会话,那么`withSession`是最佳选择(请参阅@ michal-zmuda的回答) (2认同)

Jea*_*ash 22

如果它在服务或控制器中,您只需要声明sessionFactory

def sessionFactory

注入它.之后你可以参考

sessionFactory.currentSession
Run Code Online (Sandbox Code Playgroud)

使用它.

查看hibernate-filter插件(文件HibernateFilterGrailsPlugin.groovy),了解如何注入一堆使用会话的方法.


Mic*_*d a 13

你可以使用withSession

Book.withSession { session ->
    session.clear()
}
Run Code Online (Sandbox Code Playgroud)

更多信息

  • 这似乎不是充满真理的评论。该会话不是“ Grails”会话,而是Hibernate会话。确定起来很容易;用`println session.getClass()。name`替换`session.clear()`,您很可能在输出中看到`org.hibernate.internal.SessionImpl`。 (2认同)