JPA持続性コンテキスト


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


メインキャッシュの表示

Member member = new Member();			// entity 생성(비영속 상태)
member.setId("member1");
member.setUsername("username1");
em.persist(member);				// entity 1차 캐시에 저장(영속 상태)
Member member1 = em.find(Member.class, "member1");// 1차 캐시에서 조회

データベースの問合せ

Member member2 = em.find(Member.class, "member2");
  • エンティティーマネージャは、データベーストランザクション単位で作成され、トランザクションの終了時に終了します.
    クライアントリクエストによってビジネスロジックが終了すると、永続性コンテキストがクリアされると、プライマリキャッシュも失われます.つまり、その短い瞬間だけメリットがあるということです.複数のユーザーが使用するキャッシュではありません.
  • コンシステンシ保証


    集合クエリーと同様に、JPAは永続的なエンティティの一貫性を保証します(プライマリ・キャッシュがあるため).
    Member memberA = em.find(Member.class, "member1");
    Member memberB = em.find(Member.class, "member1");
    memberA == memberB; // true

    書き込み遅延

    em.persist(memberA);
    em.persist(memberB); // 아직 insert query를 디비로 보내지 않음
    transaction.commit(); // commit할 때 디비로 query 전송
    トランザクションをコミットすると、書き込みが遅延したSQLリポジトリのクエリはリフレッシュに伴って消えます.その後、実際のDBトランザクションがコミットされます.
    ここにはバッファ機能があります.
    エンティティが永続化されるたびにDBにクエリーが発行される場合、最適化の余地はありません.
    実際、データベースにどれだけデータを入れても、コミットしないとDBは反映されません.したがって、コミット前にINSERTを入力するだけでよい.
    コミットする前に、上記の例から、書き込みが遅延しているSQLリポジトリには、クエリーが山積みになっており、クエリーを一度に解放することができます.これを可能にしたのはJDBC batch
    batchを使用するとコードが複雑になりますが、Hibernateはbatch sizeオプションとして使用できます.

    更新


    flush


    flushとは、永続性コンテキストの変更をデータベースに反映する操作です.
  • 永続コンテキストが空ではありません.
  • 永続コンテキストの変更をデータベース
  • に同期
  • トランザクションという名前のワークセルは、重要->コミット前に同期するだけです.
  • オカレンスのリフレッシュ
  • 変更検出
  • 変更エンティティへの登録遅延SQLリポジトリ
  • への書き込み
  • 書き込み遅延SQLリポジトリクエリーデータベース(登録、変更、削除クエリー)
  • へ送信
  • プライマリキャッシュはクリアされません.
  • リフレッシュモード
  • em.flush()-ダイレクトコール
  • トランザクションのコミット-自動コール
  • のリフレッシュ
  • JPQLクエリーの実行-自動コール
  • のリフレッシュ

    いつまでも続く


    じゅんれんぞくじょうたい
  • 英領->準英領
  • 永続状態にあるエンティティは、永続性コンテキストにおいて
  • を分離(分離)する.
  • は、永続性コンテキストによって提供される機能
  • をサポートしない.
    準永久状態にする方法
  • em.detach(entity)>特定のエンティティのみを準永続化
  • em.clear()>永続コンテキスト
  • を完全に初期化
  • em.close()>持続コンテキスト
  • を終了
    参考:金英漢のJPA講義