[JPA]持続性管理-持続性コンテキスト
コンセプト
特長
エンティティをプライマリ・キーで区切る
永続性コンテキストは、エンティティをテーブルの識別子値に分割します.
したがって、永続状態には識別子値が必要です.
データベースストアポイント
トランザクションをコミットする前に、Entity ManagerはSQLを永続性コンテキストに格納し、トランザクションをコミットするときにデータベースに格納します.
長所
永続性コンテキスト管理エンティティには、次の利点があります.
-メインキャッシュ
Member memeber = new Member();
member.setId(1L);
member.setName("kitty");
jpa.persist(member); // 이때 Entity Manager는 데이터베이스에 저장하는 것이 아니라, 영속성 컨텍스트에 insert문을 저장한다.
transaction.commit(); // Entity Manager가 엔티티를 저장하는 시점
jpa.persist(member)
では、識別子とエンティティがメインキャッシュにキャッシュされます.この時点で、エンティティはデータベースに保存されていません.
Member member = jpa.find(Memeber.class, 1L);
こうやってエンティティを問い合わせるときエンティティーマネージャは、データベースを最初に表示するのではなく、永続性コンテキストのプライマリキャッシュを最初に表示します.
プライマリ・キャッシュにエンティティがある場合は値を取得し、プライマリ・キャッシュにない場合はデータベースにアクセスします.
永続性コンテキストは1つのトランザクションにのみ存在します.
-一貫性保証
Member member1 = jpa.find(Member.class, 1L);
Member member2 = jpa.find(Member.class, 1L);
System.out.println(member1 == member2) // true
member1
データベースでクエリーすると、Entity Managerは永続性コンテキストのプライマリ・キャッシュに格納されます.また、クエリmember2
では、同じ識別子値を持つエンティティがプライマリキャッシュに存在するため、member2
はデータベースではなくプライマリキャッシュからクエリされる値である.したがって、member1
およびmember2
は同じエンティティの例であり、System.out.println(member1 == member2)
はtrue
を返す.-書き込み遅延
Entity Managerは、トランザクションをコミットする前に、内部クエリー・リポジトリにSQLを格納します.
コミット時に収集されたクエリーを一度にデータベースに送信します.
これを、トランザクションをサポートする書き込み遅延
transactional wirte-behind
と呼びます.Member member1 = new Member();
Member member2 = new Member();
member1.setId(1L);
member1.setName("rabbit");
member2.setId(2L);
member2.setName("piggy");
// 이 시점에서는 아직 데이터베이스에 저장하지 않고 내부 쿼리 저장소에 쿼리만 저장 (영속화) -> 쓰기지연
jpa.persist(member1);
jpa.persist(member2);
// 저장된 쿼리를 한번에 실행하여 데이터베이스에 저장
transaction.commit();
transaction.commit();
Entity Managerに永続性コンテキストをリフレッシュさせます.これはバッファリングを可能にするため,最適化の余地がある.
flush
:永続性コンテキストの変更をデータベースに同期-変更を検出
Member member = jpa.find(Member.class, 1L);
member.setName("kitty"); // SQL저장소에 update 쿼리 저장
trasaction.commit(); // update 쿼리 실행
JPAを使用してエンティティを変更する場合は、エンティティクエリー->フィールド値を変更するだけです.すなわち、変更されたエンティティを再格納するためにコードを記述する必要はありません.
変更検出を実行すると、永続性コンテキストで次のことが起こります.
transaction.commit();
Entity Manager内部でflushが呼び出されます.💡
스냅샷
:永続性コンテキストに格納されたエンティティの初期状態-エンティティは、エンティティの値を変更した場合に変更されますが、スナップショットは変更されません.
update
文は、変更フィールドのクエリーのみを変更するのではなく、すべてのフィールドのクエリー文を更新します.これは、データ転送量が増加するが、再利用性があるという欠点がある.
フィールドが特に多い場合や、格納されている内容が大きすぎる場合は、hybernate拡張
@DynamicUpdate
をオブジェクトに使用できます.同様に、
insert
生成文もあり、この文はデータの格納時に存在するフィールドのみを格納する.リファレンス
Java ORM標準JPAプログラミング-基本編 Java ORM標準JPAプログラミング(金英漢)
あなたのフィードバックを歓迎します🤗
Reference
この問題について([JPA]持続性管理-持続性コンテキスト), 我々は、より多くの情報をここで見つけました https://velog.io/@purple/JPA-영속성-관리-영속성-컨텍스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol