持続性構造

17503 ワード

エンティティを永続的に保存する環境


エンティティーマネージャを使用してエンティティーを格納または照会すると、エンティティーマネージャは永続性コンテキストでエンティティーを保持および管理します.
@SpringBootApplication
public class JpaBasicApplication {

   public static void main(String[] args) {
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");

      EntityManager em = emf.createEntityManager();

      EntityTransaction tx = em.getTransaction();

      tx.begin();
      try{
				 //insert
				 //비영속 상태
	       **Member member = new Member();
	       member.setId(1L);
	       member.setName("test");**

				 //영속상태
	       **em.persist(member);**
				 
				 //select
		     **Member findMember = em.find(Member.class, 1L); 
				 //findMember는 persist로 영속상태에 있기때문에 1차캐시에 올라간 상태이므로
				 //해당 엔티티객체를 조회할때 DB에 접근하는 것이 아닌 1차캐시로 조회**

         tx.commit();

      }catch (Exception e){
         tx.rollback();
      }finally {
         em.close();
      }
      emf.close();

      SpringApplication.run(JpaBasicApplication.class, args);
   }

}

永続性コンサルタントのメリット


  • プライマリキャッシュ
    特定のエンティティをem.persist(メンバー)として保存した後、プライマリ・キャッシュに保存します.
    メインキャッシュに永続的に格納されたデータは、レンダリングが終了するまで保持されます.
    オブジェクトが終了する前にオブジェクトを問い合わせると、JPAはまず、DB値を内部で問い合わせるのではなくメインキャッシュを検索します.
    メインキャッシュにクエリーする値がない場合、クエリーDB
    メインキャッシュに値がある場合は、そのオブジェクトを出力します.
    したがって、データベースではなくプライマリ・キャッシュからオブジェクトを直接クエリーするため、パフォーマンスに優れています.
    
    EntityTransaction tx = em.getTransaction();
    //트렌젝션 시작
    tx.begin();
    
    //비영속 상태
    Member member = new Member();
    member.setId(1L);
    member.setName("test");
    
    //영속상태
    em.persist(member); //member객체가 1차 캐시에 저장된 상태
    				 
    //select
    Member findMember = em.find(Member.class, 1L); 
    //조회하고자 하는 대상이 1차캐시에 저장된 상태이므로 db에 접근하여 조회하지않고
    //1차캐시에 저장된 데이터를 출력
    Member findMember2 = em.find(Member.class, 2L); 
    //해당 대상은 1차캐시에 저장된 상태가 아니므로 db에 접근하여 해당 데이터 출력
    
    //트렌젝션 종료
    tx.commit();
    EntityManagerは通常、レンダリング単位で作成されます.したがって、オブジェクトが終了すると、エンティティーマネージャは一緒に終了します.したがって、クライアントが要求し、ビジネス終了時に永続性コンテンツを削除すると、プライマリ・キャッシュも消えます.したがって、実際の使用では、プライマリキャッシュからパフォーマンスのメリットを得ることは難しい.

  • コンシステンシ保証
    Member findMember1 = em.find(Member.class, 1L);
    Member findMember2 = em.find(Member.class, 1L);
    System.out.println("result : "+(findMember1==findMember2)); // 결과값 : true
    同じオブジェクト内で同じオブジェクトを表示する場合は、一貫性を確保します.
    データベース・レベルではなくアプリケーション・レベルでの再読み込み可能なトランザクション・アイソレーション・レベル(プライマリ・キャッシュ)の提供

  • トランザクションの書き込み遅延をサポート
          EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
    
          EntityManager em = emf.createEntityManager();
    
          EntityTransaction tx = em.getTransaction();
    
          tx.begin();
    
    			em.persist(member);
    			em.persist(member2);
    			**//여기까지 Insert sql을 데이터 베이스에 보내지 않는다.**
          
    			tx.commit();
    			**//커밋 하는 순간 데이터베이스에 Insert Sql을 보낸다.**

  • 永続性コンテキストでは、プライマリ・キャッシュに加えて書き込み遅延SQLストレージが存在します.
    1つのオブジェクトに複数の永続化がある場合は、データをプライマリ・キャッシュに保存します.
    遅延書き込みSQLリポジトリに格納するオブジェクトをスタックするinsertクエリー
    ()をコミットすると、遅延して書き込まれたSQLリポジトリのクエリーがリフレッシュされ、クエリーが実行されます.
    クエリーの一括実行はパフォーマンスの向上に役立ちます
    persistence.xmlファイルに下部のオプションを入力すると、クエリーはvalueのサイズで集約され、一度に実行されます.
    ```xml
    <property name="hibernate.jdbc.batch_size" value="10"/>
    ```

  • 変更の検出
    エンティティの変更(変更が検出されました)
    //영속 엔티티 조회
    **Member findMember = em.find(Member.class, 1L);
    
    //영속 엔티티 수정
    findMember.setUsername("hi");
    findMember.setAge(10);
    
    // em.update(member)와 같은 코드가 필요X**
    
    //트렌젝션 종료
    tx.commit();

  • 永続エンティティにアップロードされたオブジェクトに対する変更をJPAで検出

  • 特定の永続エンティティを変更すると、更新クエリーが生成され、dbに反映されます.
    変更された動作の検出
  • 1. JPA는 commit하는시점에 내부적으로 flush()가 호출
    2. JPA는 **영속엔티티의 현재 데이터**와 **스냅샷**(DB에서 값을 읽어온 최초시점의 상태)을 **비교**
    3. 변경된 엔티티 객체에 대한 update쿼리를 만들어서 쓰기지연 sql저장소에 올림
    4. 업데이트쿼리를 DB에 반영
    5. 커밋

    エンティティのライフサイクル


  • 非永続(new/transient)
    永続性コンテキストにまったく関係のない新しい形式

  • 永続(管理)
    永続性コンテキストで管理されるシェイプ

  • じゅんれいそくど
    永続性コンテキストに格納および切断されたステータス

  • 削除(Remove)
    削除されたステータス