JPAドライバ-持続性管理

18189 ワード

JPA Dialect


JPAは特定のデータベースに依存しない

JPA完全駆動



JPAには2つの重要な

  • オブジェクト対リレーショナル・データベース・マッピング(ORM)
  • 永続性大会
  • EntityManagerFactoryとEntityManager



    →各リクエストはEntityManagerFactoryによって作成され処理される

    持続性テスト


    →「エンティティを永続的に保存する環境」
    →論理的には見えない
    →Entity Managerによる永続性テストへのアクセス
    EntityManager.persist(entity);
  • J 2 SE環境(標準版)
  • J 2 EE、スプリングフレーム等の容器環境
  • 終了ライフサイクル



    →非永続性(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);

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

  • メインキャッシュ
  • 同一性保障
  • トランザクションの書き込み遅延(=バッファ、トランザクション書き込み後)
  • 検出変更
  • 遅延ロード(Lazy Loading)
  • 1)メインキャッシュ


    // 객체를 생성한 상태 (비영속)
    Member member = new Member();
    member.setId("test1");
    member.setUsername("회원1");
    
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaciton().begin();
    
    // 객체 영속
    em.persist(member);
  • の場合1)メインキャッシュでのクエリ
  • // 객체를 생성한 상태 (비영속)
    Member member = new Member();
    member.setId("test1");
    member.setUsername("회원1");
    
    // 객체 영속 = 1차 캐시에 저장됨 
    em.persist(member);
    
    // 1차 캐시에서 조회 가능
    Member findMember = em.find(Member.class, "test1");
  • 状況2)データベースでのクエリー
  • 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()-永続コンテキスト
  • を終了