2012-02-16 2 views
0

私のサービスでは、@Transactional注釈付きの方法があります。 内部では、2つのオブジェクトでさまざまなことをやっていますが、最後には.discard()の変更が必要なので、このトランザクションには保存されません。 私が行うのは、object2に関する情報をActiveMQキューに送ります。そこでは、リスナーによってピックアップされます。そこではいくつかの作業が行われ、最後に別のトランザクションで保存されます。 Object1はいつものように保存されるはずです。Grailsの@TransactionalサービスでdomainObject.discard()が動作しないのはなぜですか?

ただし、これは機能しません。何が起こるかは、待ち行列のリスナーがオブジェクト.get()にアクセスできるようになり、最初のトランザクションが終了する前にオブジェクトに変更が加えられ、.save()になります。そのおかげで、私はorg.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)を得る。

私はサービス内でオブジェクトの.get()を実行します。サービスを終了してコントローラに戻ったときにトランザクションが保存されます。

Grailsがメイントランザクションでobject2を保存しないようにするには、どうすればよいですか?

+0

サービス内の別のメソッドにobject2アクセスを設定し、その一部または外部トランザクションではないことはできますか? –

+0

いいえ、それはキューイングのメカニズムを使用するポイントの1つです。別のトランザクションでそれを行うことです。[これは唯一のポイントではありません。] – Krystian

+0

これは私の頭の中で解明されていませんが、代わりに保存したくないオブジェクトを.read()することができれば、明示的に保存しない限り永続化されませんそれ。 –

答えて

0

サービスメソッドの終了前に、オブジェクト2に.refresh()を試すことができます。これにより、object2のデータがデータベースの更新されたデータでリロードされ、上書きされるため、オプティミスティックロックversionが一致します(これはあなたのExceptionの原因と考えられます)。また、Hibernateはオブジェクトがデータベースと一致するので、オブジェクトをフラッシュする必要はありません。

+0

これは動作するかもしれませんが、それは追加のクエリを生成し、私はそれを望んでいません。それだけでなく、それは爽やかさが必要なオブジェクト2だけではないようですが、それもコレクションです。 – Krystian

関連する問題