JPA CRUD(+永続コンテキスト)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // /persistence.xml => <persistence-unit name="hello">
EntityManager em = emf.createEntityManager(); //테이블 접근 시, 무조건 EntityManager 을 통해서 해야됨
EntityTransaction transaction = em.getTransaction(); //JPA 에서의 모든 데이터 변경을 EntityTransaction 으로 이루어짐
transaction.begin(); // 데이터베이스 transaction 을 시작
em.createQuery("delete from Member").executeUpdate(); //실행 할때마다 테이블의 모든 튜플들 삭제
transaction.commit();
//Create
Member memberA = new Member();
memberA.setId(1L);
memberA.setUsername("hello"); // Member 테이블에 저장할 튜플 생성
Member memberB = new Member();
memberB.setId(2L);
memberB.setUsername("helloB"); // Member 테이블에 저장할 튜플 생성
try {
transaction.begin(); // 데이터베이스 transaction 을 시작; 이전에 transaction.commit()을 했으면 다시 begin()을 해줘야 함
/**
* Member 테이블에 memberA && memberB 객체들 적재
*/
em.persist(memberA);
em.persist(memberB);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}
//Remove
try {
transaction.begin(); // 데이터베이스 transaction 을 시작
/**
* Column id로 원하는 튜플을 찾아서 객체로 반환 받고, 해당 객체를 제거
*/
Member findMember = em.find(Member.class, 2L);
em.remove(findMember);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}
//Update
try {
transaction.begin(); // 데이터베이스 transaction 을 시작
/**
* Column id로 원하는 튜플을 찾아서 객체로 반환 받고, 해당 객체의 값을 수정
*/
Member findMember = em.find(Member.class, 1L);
findMember.setUsername("helloJPA"); // persist()을 하지 않아도 자동으로 테이블이 업데이트 됨
transaction.commit(); //commit을 통해 변화 반영
} catch (Exception e) {
transaction.rollback();
}
try {
/**
* 쿼리문으로 원하는 값 찾기
* select *from member
*/
List<Member> memberList = em.createQuery("select m from Member as m", Member.class)
.getResultList();
for (Member mem : memberList) {
System.out.println("member.name = " + mem.getUsername());
}
} catch (Exception e) {
}
//항상 EntityManager랑 EntityManagerFactory를 close() 해줌
em.close();
emf.close();
オブジェクトを永続化として保存(オブジェクト)
remove(オブジェクト)を使用してテーブルからオブジェクトを削除するには
変更するオブジェクトをfind(オブジェクト)として配置し、返されるオブジェクトの値を変更するときにテーブルで変更します.
テーブルにインスタンスをロード、削除、変更してコミットする必要があります()
エンティティーマネージャファクトリを1つ作成するだけで、アプリケーション間で共有できます.
エンティティーマネージャは、ねじ間でXを共有します(使用して破棄する必要があります).
EntityManager.永続化(オブジェクト)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//1차 캐시에 저장됨
em.persist(member);
EntityTransaction.commit()が発生するまで、エンティティはDBに格納されません.エンティティはメインキャッシュに格納され、Buffer SQLリポジトリにINSERT INTO SQL文が格納されます.
EntityManager.find(オブジェクト)
Member findMember2 = em.find(Member.class, "member2");
//'member2' 가 1차 캐시에는 없고, 이미 DB에 저장되어 있는 상태
まず、メインキャッシュでエンティティを検索し、ない場合はDBをクエリーします.
DBにエンティティがある場合は、メインキャッシュに戻り、保存します.
永続エンティティの一貫性の確保
プライマリ・キャッシュの繰返し可能読み出しレベルを持つトランザクション
データベース・レベルではなくアプリケーション・レベルでアプリケーション・アイソレーション・レベルを指定します.
EntityManager.永続化(オブジェクト)->EntityTransaction。commit()
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit();
memberaエンティティとmemberbエンティティはメインキャッシュに格納され、EntityTransactionに格納されます.commit()が発生するまでDBには保存されません.まずメインキャッシュに格納され、各エンティティのINSERT INTO SQL文はBuffer SQLリポジトリに格納されます.
commit()が発生した場合、Buffer SQLリポジトリに保存されているSQL文が実行されます.
エンティティの変更
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
transaction.commit();
Reference
この問題について(JPA CRUD(+永続コンテキスト)), 我々は、より多くの情報をここで見つけました https://velog.io/@k_ms1998/JPA-CRUDテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol