JPAドライバ-持続性管理
18189 ワード
JPA Dialect
JPAは特定のデータベースに依存しない
JPA完全駆動
JPAには2つの重要な
EntityManagerFactoryとEntityManager
→各リクエストはEntityManagerFactoryによって作成され処理される
持続性テスト
→「エンティティを永続的に保存する環境」
→論理的には見えない
→Entity Managerによる永続性テストへのアクセス
EntityManager.persist(entity);
終了ライフサイクル
→非永続性(new/transient):永続性コンテキストにまったく関係のない新しい状態
→継続(managed):継続性テストで管理されている状態
→準永続性(分離):永続性コンテキストに格納され、分離された状態
→削除(削除):削除済み状態
1)非永続性
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
2)永続
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaciton().begin();
// 객체를 저장한 상태 (영속)
em.persist(member);
3)準零速
// 회원 객체를 영속성 컨텍스트에서 분리 (준영속 상태)
entityManager.persist(member);
4)削除
// 회원 객체를 삭제한 상태 (삭제)
entityManager.remove(member);
永続性コンテキストの利点
1)メインキャッシュ
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaciton().begin();
// 객체 영속
em.persist(member);
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
// 객체 영속 = 1차 캐시에 저장됨
em.persist(member);
// 1차 캐시에서 조회 가능
Member findMember = em.find(Member.class, "test1");
Member findMember2 = em.find(Member.class, "test2");
2)永久図形の一致性を保証する
Member a = em.find(Member.class, "test1);
Member b = em.find(Member.class, "test2);
System.out.println(a == b); // 동일성 비교 true 반환
3)エンティティ登録(トランザクションの書き込み遅延=DB反映遅延をサポート)
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// EntityManager는 데이터 변경 시 트랜잭션을 시작해야 함
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
// 아직 Insert SQL을 데이터베이스에 보내지 않음
// 커밋하는 순간 데이터베이스에 Insert SQL을 보냄
transaction.commit(); // [트랜재션] 커밋
→メンバーオブジェクトの作成後に永続化()を行うと、オブジェクトは永続的な状態になります(永続的コンテキストで管理されます).
→メンバーオブジェクトを生成するINSERT SQLが生成されますが、すぐにDBに送信されるのではなく、「遅延書き込みSQLリポジトリ」に保存されます&メインキャッシュに格納されます
→コミット()の場合、「遅延書き込みSQLリポジトリ」に格納されているSQLは、データベース
追加)batch size設定
<property name="hibernate.jdbc.batch_size" value="10"/>
SQLをデータベースに配置する(batch sizeに従って)4)エンティティの変更(変更が検出されました)
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// EntityManager는 데이터 변경 시 트랜잭션을 시작해야 함
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "test1");
// 영속 엔티티 데이터 수정
memberA.setUsername("me"); // 해당 코드만으로도 Update 쿼리가 생성되어 DB에 전달할 수 있음
em.update(memberA); // 이러한 호출이 필요없음 ! ! !
transaction.commit(); // [트랜잭션] 커밋
→ memberA.setUsername("me"); コードに更新クエリーを作成してDBに転送できます→ em.update(memberA); 追加の呼び出しは必要ありません
5)エンティティの削除
// 삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, "test1");
// 엔티티 삭제
em.remove(memberA);
その他の概念
1)更新
→リフレッシュするとメインキャッシュが保持されます(=永続コンテキストはクリアされません)
→永続性コンテキストの変更をデータベースに同期する
→「取引」という職場が大事!コミット前に同期するだけ
つながる変更の検出
推測を表す変更されたエンティティの遅延書込みSQLリポジトリへの登録
わかりません.書き込み遅延SQLリポジトリに対するクエリーをデータベース(登録、変更、削除クエリー)
Em.flush-ダイレクトコール
transaciton.commit-自動呼び出しリフレッシュ
JPQLクエリーの実行-自動リフレッシュ
2)準持続状態
→永久->準永久状態に変更可能
→永続状態にあるエンティティを永続コンテキストで分離(分離)
→永続コンテキストで提供される機能を使用する
Em.detach(entity)-特定のエンティティのみを準永続状態に変換
Em.clear()-永続コンテキストを完全に初期化
Em.close()-永続コンテキスト
Reference
この問題について(JPAドライバ-持続性管理), 我々は、より多くの情報をここで見つけました https://velog.io/@fordevelop/JPA-구동-방식-영속성-관리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol