[JPAベース粉砕]耐久性
Javaサーバーを開発しているJPAについて知りたいです.
第三に、永続性を理解します.
学習内容はJava ORM標準JPAプログラミング教材に基づいて作成された.
持続性コンテキスト
非永続性-永続性コンテキストに依存しない状態 永続-永続コンテキストに格納されたステータス 準持続性(Detached)-持続性コンテキストで分離された状態 削除-削除
非永続状態とは、エンティティのみが作成され、永続コンテキストに格納されないなどの操作の状態を指します.
永続状態は、
既存の
永続状態にあるエンティティを永続コンテキストから分離したり、永続コンテキストを初期化したりすると、エンティティは準永続状態になります.
永続コンテキストとデータベースから永続オブジェクトを削除します.
持続性コンテキストの管理
第三に、永続性を理解します.
学習内容はJava ORM標準JPAプログラミング教材に基づいて作成された.
持続性コンテキスト
永続性コンテキストは、JPAにおいて主な機能と見なすことができる.JPAがデータベースにアクセスする前に、エンティティは永続性コンテキストとして管理され、commit
の実行後にコンテンツがデータベースに渡されます.エンティティーマネージャの作成時に永続コンテキストを作成し、エンティティーマネージャで管理できます.
エンティティステータス
非永続性
非永続状態とは、エンティティのみが作成され、永続コンテキストに格納されないなどの操作の状態を指します.
// 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
として識別されるため、エンティティクラスを定義するときにエンティティを指定する必要があります.
エンティティの問合せ
永続性コンテキストでは、エンティティを管理するときに、メインキャッシュという名前の空間で管理されます.EntityManager
のfind()
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); // 엔티티 삭제
EntityManager
のremove()
APIを使用してエンティティを削除すると、他の操作を実行するように、内部クエリー・リポジトリにDELETE SQL
が作成されます.ただし、永続性コンテキストでは、すぐにエンティティが削除されるので、エンティティを変更または実行するときは特に注意してください.
更新
リフレッシュはEntityManger
のAPIであり、永続的なコンテキストの変更をすぐにデータベースに反映します.トランザクションのcommit()
APIは、SQLをデータベースに渡し、EntityManager
のflush()
APIを自動的に実行してデータベースに渡すという.
JPQLクエリを実行すると、リフレッシュも自動的に呼び出されます.
Reference
この問題について([JPAベース粉砕]耐久性), 我々は、より多くの情報をここで見つけました
https://velog.io/@crackco/JPA-기초-부수기-영속성
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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(); // 트랜잭션 커밋
tx.begin(); // 트랜잭션 시작
// member를 ID로 같고 있는 Member 엔티티 반환
Member member = em.find(Member.class, "member");
// 영속 엔티티 수정
member.setUsername("CrackCo1");
member.setAge(3);
tx.commit(); // 트랜잭션 커밋
Member memberA = em.find(Member.class, "memberA"); // 엔티티 조회
em.remove(memberA); // 엔티티 삭제
リフレッシュは
EntityManger
のAPIであり、永続的なコンテキストの変更をすぐにデータベースに反映します.トランザクションのcommit()
APIは、SQLをデータベースに渡し、EntityManager
のflush()
APIを自動的に実行してデータベースに渡すという.JPQLクエリを実行すると、リフレッシュも自動的に呼び出されます.
Reference
この問題について([JPAベース粉砕]耐久性), 我々は、より多くの情報をここで見つけました https://velog.io/@crackco/JPA-기초-부수기-영속성テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol