JPA
分離されたエンティティが に渡されたentityManager.refresh()
場合、がスローされることが仕様で義務付けられていることは理解していIllegalArgumentException
ますが、その理由がわかりません。更新メソッドの意味は、行われた変更を無視して、DB から新しいコピーを取得することです。
2 に答える
私が理解している限り、これの目的はメソッドの実際の使用refresh
法にあります。
エンティティの読み取りと実際の使用の間にデータベースの変更が発生する可能性がある場合は、更新を使用する必要があります。たとえば、あるフィールドを使用する前に、データの陳腐化を最小限に抑えたいとします。を呼び出しますrefresh
。EM は DB から最新の変更を引き出します。
切り離された実体を見過ごしてしまうと、使用目的refresh
がなんとなく無駄になってしまいます。を使用して新しいエンティティを検索するのが簡単ではないのはなぜfind
ですか?
JPA 2.0 実装が EclipseLink の場合、このドキュメントによると、エンティティ マネージャーの更新について心配する必要はありません。デフォルトでは、クエリを実行するたびに更新されます。
編集
そうです、私は最初にあなたの質問を理解していませんでした。あなたの質問に答えるには、引用元の JSR-317 JPA 仕様を参照してください。
切り離されたエンティティ インスタンスは、それらが永続化または取得された永続化コンテキストの外で存続し続けます。それらの状態は、データベースの状態と同期することが保証されなくなりました。
私の言葉では、切り離されたエンティティはエンティティ マネージャーからは見えないため、エンティティ マネージャーが切り離されたエンティティを渡されたときに、それを「不正な引数」と見なすのは理にかなっています。
私の主張を確認するには、JPA エンティティのライフサイクルをまとめたこの図を確認してください。これは、refresh() メソッドが MANAGED エンティティの状態にのみ適用されることを明確に示しています。
次の質問は次のとおりです。
MANAGED エンティティをデータベースと更新/同期する必要があるのはいつですか?
これが私の最初の答えです。