在 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 项目包名称