이곳에는 어떤식으로 진행이 되는지 간단하게 정리하려고 한다.
엔티티 등록 : 트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
- 기본적으로 commit, flush 전에는 DB에 반영하지 않고 쓰지 지연 SQL 저장소에 저장한다.
-
테스트 코드 실행
엔티티 수정 : 변경 감지(Dirty Checking)
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) 이런 코드가 있어야 하지 않을까?
transaction.commit(); // [트랜잭션] 커밋
-
JPA는 commit 시 flush() 메소드를 호출한다.
-
flush를 할 때, 엔티티와 스냅샷을 비교한다.
- 스냅샷은 1차 캐시안에 존재하는것으로, 해당 엔티티가 1차캐시로 들어올때의 값을 저장해둔것.
-
비교 후에 값의 변경이 있으면 쓰기 지연 SQL 저장소에 UPDATE 쿼리를 저장해둔다.
-
그 후에 데이터베이스에 반영
-
테스트 코드 실행
플러시에 자세한 내용은 아래 링크를 참고하면 됩니다.
prodo-developer.tistory.com/27
엔티티 삭제
//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, “memberA");
em.remove(memberA); //엔티티 삭제
'SPRING > 기본 문법' 카테고리의 다른 글
[SPRING] JPA 연관관계 매핑 기초 (0) | 2021.03.10 |
---|---|
[SPRING] JPA 엔티티 매핑 (0) | 2021.03.09 |
[SPRING] JPA 플러시 (0) | 2021.03.09 |
[SPRING] JPA 영속성 컨텍스트 (0) | 2021.03.09 |
[SPRING] addAttribute & addFlashAttribute 차이점 (0) | 2021.02.26 |