在 Grails 外部使用 GORM 时找不到会话错误
Session not found error while using GORM outside Grails
我正在尝试创建一个 POC,以便在 Grails 之外使用 GORM。我创建了一个 groovy-gradle 独立插件。我跟着 official docs 和
在 main()
class 中对我的用户域进行了 count()
查询。 运行 使用 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。
我正在尝试创建一个 POC,以便在 Grails 之外使用 GORM。我创建了一个 groovy-gradle 独立插件。我跟着 official docs 和
在 main()
class 中对我的用户域进行了 count()
查询。 运行 使用 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。