永続性管理-内部動作
持続性コンテキスト
JPAで最も重要な2つオブジェクトをリレーショナル・データベース にマッピングする.持続コンテキスト Entity Manager Factory
Webアプリケーションを開発している場合は、エンティティーマネージャファクトリを使用して、お客様に要求するたびにエンティティーマネージャが作成されます.
エンティティーマネージャは、データ接続を使用してDBを使用します.
永続性コンテキストとは? JPAの最も重要な用語 を理解するは「永続記憶エンティティの環境」 を表す. EntityManager.persist(entity); 論理概念 がなくなりました. エンティティーマネージャによる永続コンテキスト へのアクセス
エンティティのライフサイクル非零速(new/transient)
永続性コンテキストにまったく関係のない新しいステータス 英領(管理)
永続性コンテキストで管理するステータス 準零速(分離)
は「永続性」コンテキストにあり、切断されています.
削除(削除)
削除済みステータス
非永続性
準永続、削除
永続性コンテキストの利点メインキャッシュ 同一性保障 トランザクションをサポートする書き込み遅延 変更検出 遅延ロード プライマリキャッシュ
これに関連して、ケイシーのおかげで一致性が保証されたと聞きました.
では、データベースから取得したものは同一性を保証できませんか?好奇心を持って小さな実験をした.
DBクエリに送信して取得した値は同じですか?
同じ
トランザクションの書き込み遅延をサポート
簡単に言えば、em.persist()を実行しても、すぐにデータベースにクエリーが発行されません.
すべて送信するには、トランザクションをコミットする必要があります.
変更の検出
簡単に言えば、トランザクションがコミットされると、値が変更されると自動的に変更されます.
より詳細には、データベースから値を取得してもfindで値を見つけても、最初に作成したエンティティをスナップショットに格納します.
その後、値が変更された場合、
トランザクションがコミットされると、
エンティティの削除永続コンテキストへの変更をデータベースに反映する オカレンスのリフレッシュ変更検出 修正エンティティ遅延書込みSQLリポジトリに登録 書き込み遅延SQLリポジトリのクエリーをデータベースに送信
(登録、変更、削除クエリー) 永続性コンテキストをリフレッシュします. em.flush()-ダイレクトコール トランザクションコミット-自動コール をリフレッシュ
実行 JPQLクエリー-自動呼び出し をリフレッシュ
リフレッシュ後もメインキャッシュ値は保持されます.
JPQLクエリの実行時にリフレッシュが自動的に呼び出される理由
では、JPQLを中間で実行し、メンバーABCを問い合せます.
リフレッシュ・モード・オプション FlushModeType.AUTO
コミットまたはクエリー時のリフレッシュ(デフォルト) FlushModeType.COMMIT
コミット時のみ更新 何の役にも立たない.必ず提出してください.
更新持続コンテキスト をクリアしない永続コンテキストの変更をデータベース に同期トランザクションは重要です->コミット前に同期するだけで じゅんれんぞくじょうたい英領->準英領 永続状態にあるエンティティは、永続性コンテキストにおいて を分離(分離)する.は、永続性コンテキストによって提供される機能 をサポートしない.
準永久ビームの作成方法 em.detach(entity)
準ゼロ状態に変換 em.clear()
完全初期化持続コンテキスト em.close()
持続コンテキスト を終了
(エンティティ機能は適用されません)
したがって,テストの際に,持続性コンテキストで要求されたものをもう一度見たい場合は,目を用いる.
JPAで最も重要な2つ
Webアプリケーションを開発している場合は、エンティティーマネージャファクトリを使用して、お客様に要求するたびにエンティティーマネージャが作成されます.
エンティティーマネージャは、データ接続を使用してDBを使用します.
永続性コンテキストとは?
エンティティのライフサイクル
永続性コンテキストにまったく関係のない新しいステータス
永続性コンテキストで管理するステータス
削除(削除)
削除済みステータス
非永続性
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); // 엔티티 삭제
更新(登録、変更、削除クエリー)
実行
リフレッシュ後もメインキャッシュ値は保持されます.
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)
コミットまたはクエリー時のリフレッシュ(デフォルト)
コミット時のみ更新
更新
準永久ビームの作成方法
完全初期化持続コンテキスト
持続コンテキスト
Entity
を使用すると、以降detach
で変更しても変更は検出されません.(エンティティ機能は適用されません)
set
では、メインキャッシュ内のコンテンツがすべて失われたため、再要求される.したがって,テストの際に,持続性コンテキストで要求されたものをもう一度見たい場合は,目を用いる.
Reference
この問題について(永続性管理-内部動作), 我々は、より多くの情報をここで見つけました https://velog.io/@seungju0000/영속성-관리-내부-동작-방식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol