2011-08-12 93 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