Grails:从后台线程访问GORM

时间:2011-08-12 16:39:28

标签: grails gorm executor

我一直在努力解决这个错误一周,而且我对此严重失去了理智!我已经尝试过多种实现,解决方法和黑客攻击以及什么不是,但我只是勉强进入另一个例外。

我使用Executor插件以异步方式运行方法:

runAsync{
   run(...)
}

该方法最初会删除一些对象:

page.delete(flush:true)

然后可能会重新创建这些对象:

def page = new Page(type : Page.TYPE_TABLE, domain : domainVersion.domain, identifier : tableName)
page.save(flush: true, failOnError: true)

但是,由于以下异常而失败:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.ramboll.egs.ohs.domain.Domain#1]

PageDomain之间的关系只是由具有Page属性的Domain实现。否hasMany og belongsTo - 由于性能问题,我在之前的帖子中对此不感兴趣。

我想我已尝试过savemergewithTransachtionPersistenceContextInterceptor的所有可想象的组合...

这应该如何运作?请举例。

提前致谢!

1 个答案:

答案 0 :(得分:0)

似乎没有在新线程中工作是问题,它看起来像是标准验证问题。它说Page为空,表示验证错误,因为save()返回实例成功,或null如果有一个或多个验证错误。有几个选择:

def page = new Page(type : Page.TYPE_TABLE,
     domain: dbUpdate.domainVersion.domain, identifier: tableName)
page.save(flush:true)
if (page.hasErrors()) {
   // handle errors
}
else {
   def pageVersion = createPageVersion(page, dbUpdate.domainVersion,
       con, tableName, dbUpdate.author).save(flush:true)
}

或使用failOnError抛出异常:

def page = new Page(type : Page.TYPE_TABLE, identifier: tableName,
     domain: dbUpdate.domainVersion.domain).save(flush:true, failOnError: true)
def pageVersion = createPageVersion(page, dbUpdate.domainVersion,
    con, tableName, dbUpdate.author).save(flush:true)