2011-08-12 9 views
0

私はこのエラーを1週間は苦労しています。私は真剣にこれを忘れています!私はmultible実装と回避策とハックを試しましたが、私はちょうど別の例外にstubling続けています。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のすべてthinkable組み合わせを試してみましたと思う...

は、これはどのように動作するようになっていますか?例をお願いします。

ありがとうございます!

+0

それがどのように失敗するのですか?擬似コードだけではないコードを表示してください。 –

+0

最初の行が保存されていますか?制約違反を示すnullが返されるかどうかを確認します。また、無効な場合に例外をスローする 'save(flush:true、failOnError:true)'も考慮してください。 –

答えて

0

新しいスレッドでの作業が問題であるとは思われません。これは標準的な検証問題のようです。 Pageはnullです。これは、成功した場合はsave()がインスタンスを返すため、検証エラーを示します.1つ以上の検証エラーがある場合は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

あなたのアドバイスは私にいくつか突然の間違いを認識させました。 – Krauw

関連する問題