2011-12-14 13 views
3

JPA実装者(Hibernateなど)が永続コンテキストに添付されたエンティティを監視し、エンティティのいずれかのフィールドが変更された場合、その変更はデータベースに更新されます。JPAダーティチェック

私の質問は、JPAはどのように変更を追跡していますか?エンティティは(プロキシによって)傍受されないので、確かに "セッター"の傍受を介してではありません、どのように行われますか?

私はこの「ダーティチェック」機能の実装の詳細に興味があります。

答えて

7

これらはすべての実装に依存します。です(JPA仕様ではここで1ビットは役に立ちません)。

いくつかの実装(例えば、DataNucleus、OpenJPA)は、バイトコード拡張を使用し、読み込み後に汚れているフィールドを効率的に管理できます(元のフィールド値のスナップショットを保持する必要はありません)。

他の実装は、以前の値(またはデータストアとの比較を介して)と比較する必要があります。

5

ロード時にロードされたエンティティのスナップショットを作成し、これらのスナップショットをメモリに保持し、フラッシュ時にエンティティのスナップショットを現在の状態と比較します。状態が異なる場合は、エンティティを更新する必要があります。それらがまだ一致していれば、それはしてはならない。

0

これまでのところ、hibernateはそのダーティチェックオプションを拡張しました。 Hibernateは、バイトコードのインスツルメンテーションとカスタムダーティチェックオプションもサポートするようになりました。これらの新しいオプションの詳細については、this linkを参照してください。