在 Grails 中,如何访问域类静态方法中的休眠会话?

Posted

技术标签:

【中文标题】在 Grails 中,如何访问域类静态方法中的休眠会话?【英文标题】:In Grails how do I access the hibernate session inside of a domain class static method? 【发布时间】:2010-12-26 07:14:56 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢伯特。我会试试这个。 ApplicationHolder 现已弃用,是否有更新方法? import grails.util.Holders 将导入未弃用的静态 Holder,然后 Holders.grailsApplication.mainContext.sessionFactory 将为您提供 sessionFactory 的句柄。 避免Holders。仅仅因为它没有被弃用并不意味着你应该使用它。事实上,它与ApplicationHolder 和其他人有完全相同的问题,也应该被弃用和删除。如果您要查找的只是当前的 Hibernate 会话,withSession 是最佳选择(请参阅@michal-zmuda 的答案)【参考方案2】:

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

定义会话工厂

将其注入。之后可以参考

sessionFactory.currentSession

使用它。

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

【讨论】:

我正在专门研究如何从域类静态方法中获取它。我不想从控制器获取会话并将其传递给方法。那是1990年代的 我在 Grails 2.1 上试过这个,会话工厂似乎没有注入到服务中。上面伯特的方法似乎仍然有效。 我尝试使用 grails 2.4.4 并且它没有被注入。 在 Grails 3.2.2 中完美运行。【参考方案3】:

你可以使用 withSession

Book.withSession  session ->
    session.clear()

More info

【讨论】:

这似乎没有给你完整的 Hibernate 会话,而是一个 Grails 会话,它缺少一些方法(例如createSQLQuery 这似乎不是一个充满真理的评论。该会话不是“Grails”会话,而是 Hibernate 会话。这很容易确定;将session.clear() 替换为println session.getClass().name,您很有可能在输出中看到org.hibernate.internal.SessionImpl

以上是关于在 Grails 中,如何访问域类静态方法中的休眠会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用域类字符串名称访问用户定义的 Grails 项目包名称

弹性搜索 hibernate 和 mongodb 域类 - Grails

Grails 中的 SQL/数据库视图

如何在 Grails 2.2 中设置域类值的默认值?

如何将 Grails 域类映射到 DTO?

Grails 迭代域类的所有 id 的最佳方法