永続性管理-内部動作


持続性コンテキスト
JPAで最も重要な2つ
  • オブジェクトをリレーショナル・データベース
  • にマッピングする.
  • 持続コンテキスト
  • Entity Manager Factory

    Webアプリケーションを開発している場合は、エンティティーマネージャファクトリを使用して、お客様に要求するたびにエンティティーマネージャが作成されます.
    エンティティーマネージャは、データ接続を使用してDBを使用します.
    永続性コンテキストとは?
  • JPAの最も重要な用語
  • を理解する
  • は「永続記憶エンティティの環境」
  • を表す.
  • EntityManager.persist(entity);
  • 論理概念
  • がなくなりました.
  • エンティティーマネージャによる永続コンテキスト
  • へのアクセス

    エンティティのライフサイクル
  • 非零速(new/transient)
    永続性コンテキストにまったく関係のない新しいステータス
  • 英領(管理)
    永続性コンテキストで管理するステータス
  • 準零速(分離)
  • は「永続性」コンテキストにあり、切断されています.
    削除(削除)

  • 削除済みステータス

  • 非永続性
    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
    永続
    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
    
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    
    em.persist(member);
    コミット後のデータベースに格納された時点
    準永続、削除
    //회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
    em.detach(member);
    
    //객체 삭제
    em.remove(member);
    detachでは、データベースは値を保持し、永続性コンテキストでは保持しません.removeの場合もDBクリア値になりますか?
    永続性コンテキストの利点
  • メインキャッシュ
  • 同一性保障
  • トランザクションをサポートする書き込み遅延
  • 変更検出
  • 遅延ロード
  • プライマリキャッシュ
    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
    
    em.persist(member);
    メインキャッシュの表示
    //1차 캐시에서 조회
    Member findMember = em.find(Member.class, "member1");
    データベースでのクエリー
    Member findMember2 = em.find(Member.class, "member2");
    永続エンティティの一貫性の確保
    Member a = em.find(Member.class, "member1");
    Member b = em.find(Member.class, "member1");
    
    System.out.println(a == b); // 동일성 비교 true
    データベース・レベルではなくアプリケーション・レベルでの再読み込み可能なトランザクション・アイソレーション・レベル(プライマリ・キャッシュ)の提供
    これに関連して、ケイシーのおかげで一致性が保証されたと聞きました.
    では、データベースから取得したものは同一性を保証できませんか?好奇心を持って小さな実験をした.

    DBクエリに送信して取得した値は同じですか?

    同じ
    トランザクションの書き込み遅延をサポート
    簡単に言えば、em.persist()を実行しても、すぐにデータベースにクエリーが発行されません.
    すべて送信するには、トランザクションをコミットする必要があります.



    変更の検出
    簡単に言えば、トランザクションがコミットされると、値が変更されると自動的に変更されます.

    より詳細には、データベースから値を取得してもfindで値を見つけても、最初に作成したエンティティをスナップショットに格納します.
    その後、値が変更された場合、Entityは変更された値を保存します.
    トランザクションがコミットされると、flushが呼び出されると、JPAがスナップショットと比較し、SQLで更新を作成してデータベースにコミットする場合.
    エンティティの削除
    Member memberA = em.find(Member.class, "memberA");
    
    em.remove(memberA); // 엔티티 삭제
    更新
  • 永続コンテキストへの変更をデータベースに反映する
  • オカレンスのリフレッシュ
  • 変更検出
  • 修正エンティティ遅延書込みSQLリポジトリに登録
  • 書き込み遅延SQLリポジトリのクエリーをデータベースに送信
    (登録、変更、削除クエリー)
  • 永続性コンテキストをリフレッシュします.
  • em.flush()-ダイレクトコール
  • トランザクションコミット-自動コール
  • をリフレッシュ
    実行
  • JPQLクエリー-自動呼び出し
  • をリフレッシュ
    リフレッシュ後もメインキャッシュ値は保持されます.
    JPQLクエリの実行時にリフレッシュが自動的に呼び出される理由
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    
    // 커밋, 플러시를 따로 안했기 때문에 아직 데이터베이스로 저장이 안됨.
    
    // 중간에 JPQL 실행
    query = em.createQuery("select m from Member m", Member.calss);
    // 데이터를 아직 저장하지 않아서 위 세 맴버 조회 안됨.
    これらの理由で問題が発生する可能性があり、JPQLクエリを実行すると、無条件にリフレッシュが自動的に呼び出されます.
    では、JPQLを中間で実行し、メンバーABCを問い合せます.
    リフレッシュ・モード・オプション
    em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO
    コミットまたはクエリー時のリフレッシュ(デフォルト)
  • FlushModeType.COMMIT
    コミット時のみ更新
  • 何の役にも立たない.必ず提出してください.
    更新
  • 持続コンテキスト
  • をクリアしない
  • 永続コンテキストの変更をデータベース
  • に同期
  • トランザクションは重要です->コミット前に同期するだけで
  • じゅんれんぞくじょうたい
  • 英領->準英領
  • 永続状態にあるエンティティは、永続性コンテキストにおいて
  • を分離(分離)する.
  • は、永続性コンテキストによって提供される機能
  • をサポートしない.
    準永久ビームの作成方法
  • em.detach(entity)
  • 準ゼロ状態に変換
  • em.clear()
    完全初期化持続コンテキスト
  • em.close()
    持続コンテキスト
  • を終了Entityを使用すると、以降detachで変更しても変更は検出されません.
    (エンティティ機能は適用されません)setでは、メインキャッシュ内のコンテンツがすべて失われたため、再要求される.
    したがって,テストの際に,持続性コンテキストで要求されたものをもう一度見たい場合は,目を用いる.