[JPA]永続性コンテキスト(4)-エンティティの変更
永続コンテキストの最後の残りの特徴変更検出(Dirty Checking)を理解し、永続コンテキストはこれで終了します.
まず、変更検出について理解し、次のコードを直接見てみましょう.
(メンバーテーブルにid(PK)が1、nameが「メンバー1」のデータが含まれていると仮定)
🎈 サンプルコード1
「えっ?どうして更新ドアが実行されたの?」という考えがありました.私はfindMemberオブジェクトのフィールド値を変更しただけで、DBやJPAに関するコードは作成されていません.値を変更するとupdate()のようなコードが必要になります(存在するかどうかはわかりませんが).
このような魔法のようなことが起こり得るのは、永久的なコンテキストの「検出変更」特性のおかげだ.下図を見る
上の図に示すように、メンバーオブジェクトがプライマリキャッシュに格納されたときに一緒に保存されるスナップショットと呼ばれるプライマリキャッシュが存在します.以降のトランザクションがコミットまたはリフレッシュ時に現在のエンティティ・オブジェクトとスナップショットを変更した場合、対応するUPDATE文が作成され、DBに送信されます.JPAはこの機能を「変更の検出」(Dirty Checking)と呼ぶ.
最後に、永続コンテキストの遅延ロード(Lazy Loading)には重要な特性があり、この部分は1つのmemberテーブルで説明するだけでは少し不足しているため、今回の永続コンテキストシリーズでは説明せずに、しばらく延期します.
これにより、永続性コンテキストの説明が終了します.書いても大したことはありませんが、言いすぎたようで、会社の言い訳をして、ブログを書く時間が長いです.今は会社を辞めても言い訳はありません.頑張って使います.😬
まず、変更検出について理解し、次のコードを直接見てみましょう.
(メンバーテーブルにid(PK)が1、nameが「メンバー1」のデータが含まれていると仮定)
🎈 サンプルコード1
Member findMember1 = em.find(Member.class, 1L);
findMember1.setName("member2");
tx.commit();
🎉 ログ1Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
Hibernate:
/* update
hellojpa.Member */ update
Member
set
name=?
where
id=?
まず、idが1のメンバーデータをem.find()でクエリするので、selectクエリの出現は難しくありません.もちろん、このプロセスでは、データは永続的なコンテキストにキャッシュされ、より正確には、データはプライマリキャッシュにキャッシュされ、オブジェクトの参照値はfindMember変数に含まれます.次にsetterメソッドでmemberオブジェクトのname値を変更し、トランザクションをコミットします.「えっ?どうして更新ドアが実行されたの?」という考えがありました.私はfindMemberオブジェクトのフィールド値を変更しただけで、DBやJPAに関するコードは作成されていません.値を変更するとupdate()のようなコードが必要になります(存在するかどうかはわかりませんが).
このような魔法のようなことが起こり得るのは、永久的なコンテキストの「検出変更」特性のおかげだ.下図を見る
上の図に示すように、メンバーオブジェクトがプライマリキャッシュに格納されたときに一緒に保存されるスナップショットと呼ばれるプライマリキャッシュが存在します.以降のトランザクションがコミットまたはリフレッシュ時に現在のエンティティ・オブジェクトとスナップショットを変更した場合、対応するUPDATE文が作成され、DBに送信されます.JPAはこの機能を「変更の検出」(Dirty Checking)と呼ぶ.
最後に、永続コンテキストの遅延ロード(Lazy Loading)には重要な特性があり、この部分は1つのmemberテーブルで説明するだけでは少し不足しているため、今回の永続コンテキストシリーズでは説明せずに、しばらく延期します.
これにより、永続性コンテキストの説明が終了します.書いても大したことはありませんが、言いすぎたようで、会社の言い訳をして、ブログを書く時間が長いです.今は会社を辞めても言い訳はありません.頑張って使います.😬
Reference
この問題について([JPA]永続性コンテキスト(4)-エンティティの変更), 我々は、より多くの情報をここで見つけました https://velog.io/@jin0849/JPA-영속성-컨텍스트3-엔티티-수정テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol