2011-08-12 52 views
0

我一直在努力解决这个错误一个星期了,而且我正在认真地对此失去理智!我已经尝试了multible的实现和解决方法,并且还没有做什么,但是我只是将它保存为另一个异常。Grails:从后台线程访问GORM

我使用的执行人插件运行asynchroniously的方法:

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和之间的关系可以简单地通过具有Domain属性Page实现。否hasMany og belongsTo - 由于性能问题,我在之前的帖子中对此感到气馁。

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

这是如何工作的?请举例。

在此先感谢!

+0

它是如何失败?请显示一些不只是伪代码的代码。 –

+0

你确定第一行保存了吗?检查它是否返回null,表示违反约束。还要考虑'save(flush:true,failOnError:true)',如果无效,抛出异常 –

回答

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) 
+0

您的建议让我意识到一些rookike错误,现在我已经用更合适的描述更新了这个问题。 – Krauw