[JPA]持続性管理-持続性コンテキスト



コンセプト

  • Entity永続ストレージ環境
  • 非可視論理概念
  • Entity Managerアクセス
  • 特長


  • エンティティをプライマリ・キーで区切る
    永続性コンテキストは、エンティティをテーブルの識別子値に分割します.
    したがって、永続状態には識別子値が必要です.

  • データベースストアポイント
    トランザクションをコミットする前に、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が呼び出されます.
  • 変更されたエンティティを検索するエンティティとスナップショットを比較します.
  • 変更されたエンティティがある場合は、更新クエリが生成され、遅延書き込みのSQLリポジトリにクエリが保存されます.
  • SQLリポジトリのクエリーがデータベースに送信されます.
  • データベース・トランザクションをコミットします.
    💡 스냅샷:永続性コンテキストに格納されたエンティティの初期状態
    -エンティティは、エンティティの値を変更した場合に変更されますが、スナップショットは変更されません.
  • 変更検出を実行するupdate文は、変更フィールドのクエリーのみを変更するのではなく、すべてのフィールドのクエリー文を更新します.
    これは、データ転送量が増加するが、再利用性があるという欠点がある.
    フィールドが特に多い場合や、格納されている内容が大きすぎる場合は、hybernate拡張@DynamicUpdateをオブジェクトに使用できます.
    同様に、insert生成文もあり、この文はデータの格納時に存在するフィールドのみを格納する.

    リファレンス


    Java ORM標準JPAプログラミング-基本編 Java ORM標準JPAプログラミング(金英漢)

    あなたのフィードバックを歓迎します🤗