JPA持続性


概要


JPAを学習する過程で,最も重要な持続性概念を学習し,まとめた.

JPA持続性


持続性コンテキスト


これは、エンティティを永続的に格納する環境であることを意味します.
アプリケーションとデータベースの間にオブジェクトを格納します.エンティティマネージャを使用してエンティティを保存または照会すると、エンティティマネージャは永続性コンテキストでエンティティを保持および管理します.
em.persist(car);
これは、エンティティマネージャを使用してメンバーエンティティを永続性コンテキストに格納することを意味します.

永続性コンテキストのフィーチャー

  • エンティティマネージャを作成するときに作成します.
  • エンティティーマネージャを使用して、永続性コンテキストにアクセスおよび管理できます.
  • ライフサイクル終了



    画像ソース:https://blog.woniper.net/266
  • 非永続(new/transient):永続コンテキストに関係のない状態
  • 英領(ホスティング):永続性コンテキストに格納された状態
  • .
  • 準零速(分離):零速コンテキストに格納分離状態
  • .
    削除(削除)
  • :削除済みステータス
  • 非永続(new/transient)


    エンティティオブジェクトは作成されましたが、永続コンテキストには保存されていません.
    Car car = new Car();

    永続(管理)


    entity managerがentity持続性コンテキストに格納する状態により、持続性コンテキストによって管理されることを示す
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    
    entityManager.persist(car);

    じゅんれいそくど


    永続性コンテキストによって管理される永続状態のエンティティを管理しない場合は、準永続状態に変更されます.em.detach()を呼び出して、特定のエンティティを準永続状態にします.
    // 영속성 컨텍스트에서 분리해 준영속 상태로 변경
    entityManager.detach(car);
    // 영속성 컨텍스트를 비워도 관리되던 엔티티는 준영속 상태
    entityManager.claer();
    // 영속성 컨텍스트를 종료해도 관리되던 엔티티는 준영속 상태
    entityManager.close();
    準零速状態では以下のような特徴がある.
    永続コンテキスト(
  • プライマリキャッシュ、書き込み遅延、変更検出、遅延ロードを含む)は、機能しません.
  • の識別子値があります.
  • 削除(削除)


    永続コンテキストとデータベースからエンティティを削除
    entityManager.remove(car);

    永続性コンテキストのフィーチャー


    永続性コンテキストの識別子値


    永続性コンテキストはentityを識別子値に分割します.永続状態では識別子値が必要です.

    永続性コンテキストとデータベースの保存


    JPAは通常、トランザクションがコミットされた瞬間に、flushと呼ばれる永続性コンテキストに新しく格納されたエンティティをデータベースに反映します.

    エンティティの管理における永続性コンテキストの利点

  • メインキャッシュ
  • 英領エンティティの同一性保障
  • トランザクションをサポートする書き込み遅延
  • 変更検出
  • 遅延ロード
  • プライマリキャッシュ


    永続性コンテキストの内部には、プライマリ・キャッシュと呼ばれるキャッシュがあります.
    永続的なentityはここに格納され、プライマリキャッシュのキーは識別子値(デフォルトキー)、値はentityインスタンスです.
    Car car = entityManager.find(Car.class, "car1");
    クエリの順序は次のとおりです.
  • メインキャッシュでエンティティ
  • を問い合わせる.
  • がある場合、エンティティ
  • は、メモリ内のプライマリキャッシュ内で問合せられます.
  • がない場合は、
  • がデータベースでクエリーされます.
    クエリーの
  • データを使用してエンティティを作成し、プライマリ・キャッシュ
  • に保存します.
    クエリ
  • のentity
  • を返します.

    永続エンティティの一貫性の確保


    永続性コンテキストはentityの一貫性を保証します
    Car a = entityManager.find(Car.class, "car1");
    Car b = entityManager.find(Car.class, "car1");
    
    System.out.print(a==b); //true

    トランザクションの書き込み遅延をサポート


    em.find(entity)を使用して保存しても、エンティティマネージャには、トランザクションがコミットされるまで内部クエリー・リポジトリでinsertクエリーが実行されます.トランザクションのコミット時に収集されたクエリーをDBに送信します.これを、トランザクションをサポートする書き込み遅延と呼びます.

    変更の検出


    entityを変更する場合は、クエリー後にデータを変更すればいいです.
  • トランザクションがコミットされると、エンティティマネージャ内でflush
  • が最初に呼び出されます.
  • エンティティをスナップショットと比較して、変更されたエンティティ
  • を検索します.
    エンティティが
  • に変更された場合、変更クエリーが生成され、遅延書き込みのSQLリポジトリ
  • に保存されます.
  • 書き込み遅延リポジトリをリフレッシュするSQL
  • データベース・トランザクションのコミット
  • 変更検出は、永続的コンテキストによって管理される永続的ステータスエンティティにのみ適用されます.
    EntityManager em = emf.createEntityManager();
    EntityTransaction transaction = em.getTransaction();
    transaction.begin();
    
    Member member = em.find(Member.class, "member1");
    member.setName("멤버1");
    
    transaction.commit();

    更新


    永続性コンテキストの変更をデータベースに反映することをリフレッシュと呼びます.
    永続性コンテキストのentityをクリアするのではなく、変更をデータベースに同期します.
  • 変更が検出され、スナップショットと比較して変更されたエンティティクエリー
  • 修正エンティティのUPDATEクエリーを作成し、SQLリポジトリ
  • に保存します.
  • クエリー遅延SQLストレージをデータベース
  • に送信

    ソース

  • 個のJava/spring Web開発マスターデータ秒の差を一度に達成-高速キャンパス
  • JPA持続性コンテキストとは?