1

JPA 2.0 仕様では、95 ページでPrePersistおよびコールバックについて説明しています。PreRemove

PrePersist および PreRemove コールバック メソッドは、特定のエンティティに対してそれぞれの EntityManager の永続化および削除操作が実行される前に呼び出されます。マージ操作が適用され、新しくマネージド インスタンスが作成されるエンティティの場合、エンティティの状態がマネージド インスタンスにコピーされた後、マネージド インスタンスに対して PrePersist コールバック メソッドが呼び出されます。これらの PrePersist および PreRemove コールバックは、これらの操作がカスケードされるすべてのエンティティでも呼び出されます。PrePersist および PreRemove メソッドは、同期の永続化、マージ、および削除操作の一部として常に呼び出されます。

私の母国語は英語ではないので、他の人にとっては何を明確に理解できるかを誤解するかもしれません. または、引用で1つまたは2つの説明を使用できます。しかし、私は理解できません:

PrePersist および PreRemove コールバックは、実行中の Java EE アプリケーションのライフタイムごとに 1 回だけ呼び出されますか?

コールバックがEntityManager#persist(java.lang.Object)およびEntityManager#remove(java.lang.Object)への呼び出しと完全に同期されている場合、はい、コールバックが 1 回だけ起動されることを期待しています。私は通常、自分のエンティティを 2 回以上永続化することはありません。単に楽しみのためにエンティティを何度も削除することもありません。悲しいかな、これは「ただの」私の推論です。

しかし!新しいトランザクションの開始時に 1 つのエンティティを永続化するコードがあるとします。次に、同じトランザクション内で、エンティティをいくつかの新しい永続化されていないエンティティに接続します。トランザクションがコミットされる前に、所有エンティティで EntityManager#persist への 2 番目のスムーズな呼び出しを使用して、これらすべての関係に対してカスケード永続化操作を誘発することは直感的であり、間違いではありません。その場合.. PrePersist コールバックが再度呼び出されますか?

4

0 に答える 0