[JPAベース粉砕]耐久性


Javaサーバーを開発しているJPAについて知りたいです.
第三に、永続性を理解します.
学習内容はJava ORM標準JPAプログラミング教材に基づいて作成された.

持続性コンテキスト


永続性コンテキストは、JPAにおいて主な機能と見なすことができる.JPAがデータベースにアクセスする前に、エンティティは永続性コンテキストとして管理され、commitの実行後にコンテンツがデータベースに渡されます.エンティティーマネージャの作成時に永続コンテキストを作成し、エンティティーマネージャで管理できます.

エンティティステータス


  • 非永続性-永続性コンテキストに依存しない状態
  • 永続-永続コンテキストに格納されたステータス
  • 準持続性(Detached)-持続性コンテキストで分離された状態
  • 削除
  • -削除
  • 非永続性


    非永続状態とは、エンティティのみが作成され、永続コンテキストに格納されないなどの操作の状態を指します.
    // Member 객체 생성
    Member member = new Member();
    member.setId("id");
    member.setUsername("CrackCo");
    Memberオブジェクトmemberが生成され、値が初期化された後に何の動作もしない非永久状態となる.

    永続(Managed)


    永続状態は、EntityManagerによって永続コンテキストに保存される.エンティティはEntityManagerによって管理されます.
    // 객체를 영속성 컨텍스트에 저장
    em.persist(member);
    memberは、EntityManagerのAPI persist()を介して永続コンテキストに格納され、永続状態にある.
    既存のpersist() APIはデータベースに格納されているが、正確には永続性コンテキストに格納されている.

    じゅんれいそくど


    永続状態にあるエンティティを永続コンテキストから分離したり、永続コンテキストを初期化したりすると、エンティティは準永続状態になります.
    // 객체를 영속성 컨텍스트에서 분리
    em.detach(member);
    
    // 영속성 컨텍스트 초기화
    em.clear();
    memberは、EntityManagerのAPI detach()によって永続性コンテキストから分離された永続状態である.

    削除


    永続コンテキストとデータベースから永続オブジェクトを削除します.
    em.remove(member);
    memberは、EntityManagerのAPI remove()を介して永続コンテキストから削除され、データベースから削除されたSQLを作成する.

    持続性コンテキストの管理


    🚨 永続性コンテキストのコンテンツを使用してデータベースにアクセスすると、エンティティは@IDとして識別されるため、エンティティクラスを定義するときにエンティティを指定する必要があります.

    エンティティの問合せ


    永続性コンテキストでは、エンティティを管理するときに、メインキャッシュという名前の空間で管理されます.EntityManagerfind() APIが呼び出され、最初にプライマリ・キャッシュでエンティティが検索されて戻され、そうでない場合はデータベースが問合せられ、エンティティが作成され、プライマリ・キャッシュに格納されて戻されます.
    永続エンティティは一貫性を保証します.
    Member a = em.find(Member.class, "member1");
    Member b = em.find(Member.class, "member1");
    System.out.println(a == b); // true

    エンティティの登録

    tx.begin(); // 트랜잭션 시작
    
    // 영속성 컨텍스트에 저장
    em.persist(memberA);
    em.persist(memberB);
    
    // 데이터베이스에 저장
    tx.commit(); // 트랜잭션 커밋
    エンティティーマネージャは、トランザクションをコミットする前に永続コンテキスト管理を行い、内部クエリー・リポジトリのINSERT SQLに操作を集中させ、トランザクションのcommit() APIを実行し、データベースにクエリーを要求します.

    エンティティの変更


    JPAでは、エンティティの変更はメインキャッシュで実行されます.
    tx.begin(); // 트랜잭션 시작
    
    // member를 ID로 같고 있는 Member 엔티티 반환
    Member member = em.find(Member.class, "member");
    
    // 영속 엔티티 수정
    member.setUsername("CrackCo1");
    member.setAge(3);
    
    tx.commit(); // 트랜잭션 커밋
    JPAは、上記で作成したエンティティを永続コンテキストで管理し、永続コンテキストにエンティティを格納するとステータスを保存します.これをスナップショットと呼びます.トランザクションがコミットされた場合、スナップショットは現在の所属オブジェクトのステータスと比較され(変更が検出されます)、変更された場合は内部クエリー・リポジトリにUPDATE SQLが作成されます.その後、SQLをデータベースに送信し、データベーストランザクションをコミットします.
    🚨 変更検出は、永続的なエンティティにのみ適用されます.

    エンティティの削除

    Member memberA = em.find(Member.class, "memberA"); // 엔티티 조회
    em.remove(memberA); // 엔티티 삭제
    EntityManagerremove() APIを使用してエンティティを削除すると、他の操作を実行するように、内部クエリー・リポジトリにDELETE SQLが作成されます.ただし、永続性コンテキストでは、すぐにエンティティが削除されるので、エンティティを変更または実行するときは特に注意してください.

    更新


    リフレッシュはEntityMangerのAPIであり、永続的なコンテキストの変更をすぐにデータベースに反映します.トランザクションのcommit() APIは、SQLをデータベースに渡し、EntityManagerflush() APIを自動的に実行してデータベースに渡すという.
    JPQLクエリを実行すると、リフレッシュも自動的に呼び出されます.