私がサービスでやっていることは大まかに次のとおりです。
runAsync
{
<some work here>
myDomainObject.merge()
}
「スレッドにバインドされた Hibernate セッションがありません。構成では、ここで非トランザクション セッションを作成することはできません」というエラーが表示されます。コードが非同期で実行されていることは確かなので、Executor プラグインが正しくセットアップされているように見えます。
次に、ドメインオブジェクト「myDomainObject」をこのスレッドにバインドしてはいけないと考えて、実行プラグインのおかげでスレッドには休止状態のセッションがあります。
runAsync
{
<work>
def instance2= MyDomainObject.get(myDomainObject.id) // works
instance2.field1=123
instance2.save() // fails
}
ここでも同じエラーが発生しますが、興味深いことに、get() は正しいデータを取得して instance2 に設定することに成功しています。失敗するのは「save()」だけです。これは、デバッガーでコードをステップ実行したことがあるからです。
最後に、次のようにすると、すべてが機能します。
runAsync
{
<some work here>
MyDomainObject.withTransaction {
myDomainObject.field1=123
myDomainObject.merge()
}
}
上記のコードを記述しているサービスをトランザクション対応に設定していないため、このトランザクションが必要な理由がわかりません。ここで私が知らない基本的な何かがあるに違いないことは知っていますが、それが何であるかを見つけることはできません。