最初のリクエストでオブジェクトが作成されても、2番目のリクエストでオブジェクトが返されるという奇妙な問題が発生しています。 のは、我々は2つのドメインクラスがあると仮定してみましょう:プットがPUT /as/<id>
を経由してAのインスタンスに送信されafterUpdateイベントフック、トランザクション、および連続したリクエストの古い状態
Class A {
static hasMany = [bs: B]
def afterUpdate() {
this.addToBs(new B(a: this))
this.save()
}
}
Class B {
static belongsTo = [a: A]
}
、update()
は@Transactional
でアノテートされRestfulController
に呼び出されます。
私たちが見ることができるのは、最初の要求の応答が返された後、フォローアップ要求がAPIコンシューマによって送信されるたびに、GET /bs
は、作成されたはずのBの新しいインスタンスを返しません最初の要求では、さらに要求で返されます。
Grailsは、トランザクションがコミットされた後にのみAPIコンシューマに応答を送信することを期待していました。これは、次のリクエストでそのトランザクションからのすべての変更が表示されるはずです。
その動作の理由は何ですか? grailsアプリが既にAPIコンシューマーに応答を送った後にトランザクションがコミットされますか?もしそうなら、デフォルトでオンになっているupdate()
の周りの@Transactional
の理由はありますか?
私はこの例ではafterUpdate
のコードをbeforeUpdate
に入れることもできますが、できる限りこの例を簡略化しようとしました。
はそのアドバイスエマニュエルいただきありがとうございます。これらのフックを適切に使用することはまだ可能かもしれないと思っていましたが、その操作をサービスに入れてチェックアウトします。 – alexanderfranke
これらのフックを使うことはできますが、 'DomainClass.withSession()'や 'DomainClass.withTransaction()'を使ってGORMの使用法を新しいセッションやトランザクションのいずれかでラップする必要があります。それぞれ、問題はフックが@transactionの外で実行されることです。 –