在Grails外部使用GORM时,找不到会话错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Grails外部使用GORM时,找不到会话错误相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个在Grails之外使用GORM的POC。我创建了一个groovy-gradle独立插件。我跟着official docs并在count()类中对我的用户域进行了main()查询。使用gradle run命令运行应用程序时遇到此错误:

Exception in thread "main" org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
    at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:317)
    at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:273)
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:230)
    at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:116)
    at org.grails.orm.hibernate.AbstractHibernateGormStaticApi.count(AbstractHibernateGormStaticApi.groovy:151)
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.count(GormEntity.groovy:620)
    at org.grails.datastore.gorm.GormEntity$Trait$Helper$count.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at com.foo.user.User.count(User.groovy)
    at com.foo.user.User$count.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at com.foo.utils.EntityInitializerUtils.initializeDomains(EntityInitializerUtils.groovy:45)
    at com.foo.utils.EntityInitializerUtils.initializeDomains(EntityInitializerUtils.groovy:21)
    at com.foo.utils.EntityInitializerUtils$initializeDomains.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at com.foo.Application.main(Application.groovy:15)
Caused by: org.hibernate.HibernateException: No Session found for current thread
    at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:116)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:688)
    at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:315)

我创建了一个Github repo来重现这个问题。尝试了一些解决方案,比如在新的事务管理器中包装动态查询调用,修改数据库配置等来解决此错误但没有任何效果。我必须在这里遗漏一些愚蠢的东西,但我还没弄清楚。

答案

您收到错误,因为您的代码中没有任何内容正在启动Hibernate会话。有几种方法可以解决这个问题。一个是你可以明确地开始会议......

User.withNewSession {
    println User.count()
}

你可以在https://github.com/jeffbrown/hibernate-gorm-poc/commit/3b7f747286b3c12367e9ab57007c57a06b493bcc看到。

另一个具有大量无关收益的更强大的选项是使用GORM数据服务。见https://github.com/jeffbrown/hibernate-gorm-poc/commit/0ba9b609ebbed9d5784d17e759275958b344004f

以上是关于在Grails外部使用GORM时,找不到会话错误的主要内容,如果未能解决你的问题,请参考以下文章

GRAILS / GORM:动态多重连接

Grails GORM:无法初始化代理 - 没有会话

GORM数据服务VS Grails服务

向 Grails 发送日期时的 GORM 默认日期格式

grails发布插件错误“找不到加载插件资源[spring.resources]的类”

为 Grails 2.4.4 配置 Auditlog 插件时找不到配置的 AuditLog 域错误