【发布时间】:2017-05-23 17:48:21
【问题描述】:
Grails 3.2.9
执行任务后,onComplete 方法无法获取休眠会话。
控制器:
def addBranch() {
Branch newBranch = new Branch(name: branchName, root: newBranchRoot, 'active':false).save();
Promise p = gitService.asyncPull(newBranch)
p.onComplete { b ->
println "finished adding branch " + branchName;
newBranch.setActive(true);
newBranch.save(); <<<=== EXCEEPTION THROWN HERE
}
p.onError { Throwable err ->
println "An error occurred ${err.message}"
}
respond(status:"ok", message:"success!");
}
服务:
public Promise<Branch> asyncPull(Branch branch) {
WebPromises.task {
initBranch(branch);
pull (branch.name);
branch;
}
}
异常堆栈跟踪
2017-05-23 13:41:29.123 [ead 6]ERROR 异步执行错误:无法获取当前休眠会话;嵌套异常是 org.hibernate.HibernateException: No Session found for c 当前话题
org.springframework.dao.DataAccessResourceFailureException: 无法获取当前的 Hibernate Session;嵌套异常是 org.hibernate.HibernateException: No Session found for c 当前线程 在 org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:317) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:273) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:230) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:116) 在 org.grails.orm.hibernate.validation.UniqueConstraint.processValidate(UniqueConstraint.java:149) 在 grails.validation.AbstractConstraint.validate(AbstractConstraint.java:107) 在 grails.validation.ConstrainedProperty.validate(ConstrainedProperty.java:979) 在 org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:206) 在 org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81) 在 org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:122) 在 org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:151) 在 org.grails.datastore.gorm.GormEntity$Trait$Helper$save$11.call(未知来源) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) 在 com.care.incasa.Branch.save(Branch.groovy) 在 com.care.incasa.Branch.save(Branch.groovy) 在 org.grails.datastore.gorm.GormEntity$save$1.call(未知来源) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 在 com.care.incasa.AdminController$_addBranch_closure1$$EQKTGeEk.doCall(AdminController.groovy:43) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springsource.loaded.ri.ReloadedTypeInvoker$2.invoke(ReloadedTypeInvoker.java:133) 在 org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1461) 在 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 在 groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 在 org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) 在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027) 在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:57) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator.invokeClosure(AsyncWebRequestPromiseDecorator.groovy:91) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator$_decorate_closure2.doCall(AsyncWebRequestPromiseDecorator.groovy:67) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator$_decorate_closure2.call(AsyncWebRequestPromiseDecorator.groovy) 在 org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1.doCall(GparsPromise.groovy:92) 在 org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1.call(GparsPromise.groovy) 在 groovyx.gpars.dataflow.DataCallback$1.run(DataCallback.java:62) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:org.hibernate.HibernateException: No Session found for current thread 在 org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:116) 在 org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:688) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:315) ...省略了44个常用框架
【问题讨论】:
-
您能否尝试在 onComplete 中再次从 DB 获取分支,而不是使用在方法开始时创建的副本,例如
def branch = Branch.get( newBranch.id )然后设置激活并保存
标签: hibernate session grails promise