1

afterInsertイベントでそのプロパティの1つを変更するドメインクラスがあります。

小さな例:

class Transaction {
   Long transactionId

   static constraints = {
       transactionId nullable: true
   }

   def afterInsert() {
       // copy the record id to transactionId;
       transactionId = id
   }
}

単体テストでドメインオブジェクト(transaction.save(flush: true)を保存するたびに、すべてが正常に行われ、が更新されます。しかし、を使用して保存されたレコードを検索しようとすると、結果が得られません。transactionIdTransaction.findByTransactionId()

   // do something
   transaction.save(flush: true)
   Transaction transaction = Transaction.findByTransactionId(1)
   // !! no results; transaction == null

save()そして、次を使用してレコードを見つける前に、ダブルを実行する必要がありfindByTransactionId()ます。

   // do something
   transaction.save(flush: true)
   transaction.save(flush: true)
   Transaction transaction = Transaction.findByTransactionId(1)
   // !! it works....

ダブルsave()はぎこちないようです。それの必要性を排除する方法についての提案はありますか?

4

2 に答える 2

1

の呼び出しsave()は、検証に合格した場合に永続化されたエンティティを返すため、後で個別に検索する理由はありません。あなたの問題は、transaction変数を(同じ名前を使用して)再インスタンス化していることだと思います。調べる必要がある場合は (そうすることはお勧めしません)、別の名前を付けてください。また、1列がAUTO-INCREMENT.

      def a = a.save(flush: true)
      a?.refresh() // for afterInsert()
      Transaction b = (a == null) ? null : Transaction.findByTransactionId(a.id)
      // (Why look it up? You already have it.)

アップデート:

を使用しているため afterInsert()、Hibernate はオブジェクトを更新する必要があることに気付かない場合があります。を呼び出した後refresh()メソッドを使用してみてくださいsave()

于 2012-06-01T17:20:21.643 に答える
0

この小さなコードにより、明らかに機能します。

def afterInsert() {
    transactionId = id
    save() // we need to call save to persist the changens made to the object
}

そのため、afterInsert で行われた変更を保持するには、afterInsert で save を呼び出す必要があります。

于 2012-06-04T05:29:48.877 に答える