JPAおよび永続性コンテキスト


持続性コンテキスト


永続性コンテキストは、エンティティを永続的に格納する環境です.
アプリケーションは、データベースから抽出されたオブジェクトを保存します.
Entity Managerでエンティティを表示または保存すると、永続性コンテキストはエンティティを保持および管理します.

エンティティのライフサイクル

  • 非永続性:永続性コンテキストに関係のない新しい状態
  • // 엔티티를 생성
    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
  • 永続:エンティティマネージャは、エンティティを永続コンテキストに格納し、ステータス
  • を管理します.
    // 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
    em.persist(entity);
    ->persistは実際にはDBに格納されるのではなく、永続性コンテキストによってエンティティを永続化します.
    persist()ポイントは、永続性コンテキストに格納されます.DBは後で保存します.

    永続性コンテキストの利点

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


    永続性コンテキストにプライマリキャッシュが存在する
    エンティティを永続性コンテキストに保存すると、オブジェクトはプライマリキャッシュにkey(id)、value(entity)値として格納されます.
    エンティティーマネージャがクエリーを実行するときは、まず永続性コンテキストのプライマリキャッシュでエンティティーを検索します.
    エンティティが存在する場合は、DBにアクセスせずに戻ります.
    エンティティが存在しない場合、エンティティマネージャはem.flush()時にデータベースにアクセスしてエンティティを取り出し、メインキャッシュに保存します.

    整合性(Identity)


    永続性コンテキストから取り出したオブジェクトは一貫性があります
    同じエンティティを2回クエリーした場合、2つのエンティティは同じエンティティです.
    データベース・レベルではなくアプリケーション・レベルでの再読み込み可能なトランザクション・アイソレーション・レベル(プライマリ・キャッシュ)の提供
    Member member1 = em.find(Member.class, "member1");
    Member member2 = em.find(Member.class, "member1");
    
    System.out.println(member1 == member2) => true