엔티티 수정하기 - 변경감지
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // 트랜잭션 start
//영속 엔터티 조회
Member memberA = em.find(Member.class, "memberA");
//영속 엔터티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//JPA는 업데이트 함수가 따로 있을까?
transaction.commit(); // 트랜잭션 commit
변경 감지 (Dirty Checking)
1. flush 함수 호출
2. 엔티티와 스냅샷 비교
JPA는 영속 컨텍스트의 1차 캐시의 스냅샷을 비교한다.
3. UPDATE SQL 생성
변동사항이 있다면, update 쿼리를 생성하여 쓰기 지연 SQL 저장소에 저장한다.
4. flush
JPA는 flush 를 통해 쓰기 지연 SQL 저장소에 있는 update 쿼리를 전송하며 DB가 쿼리를 실행하게 된다.
5. commit
마지막으로 디비는 데이터를 수정하고 커밋 후, JPA는 1차 캐시에 수정된 데이터의 스냅샷을 저장한다.
엔티티 삭제
//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // 엔티티 삭제
엔티티 삭제는 em.remove(entity)를 통해 삭제할 수 있다.
플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 역할을 담당한다.
플러시 발생
플러시가 발생하면, 변경 감지, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록하고, 저장된 쿼리를 데이터베이스에 전송한다.
영속성 컨텍스트를 플러시 하는 방법
1) em.flush() : 직접 호출
2) transaction commit : 플러시 자동 호출
3) JPQL 쿼리 실행 : 플러시 자동 호출
JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이유는..
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
해당 코드를 살펴보면 persist를 통해 데이터를 생성하더라도, commit을 호출 전(flush 호출 되기 전)이기 때문에, DB에 데이터가 생성된 상태는 아니다. 하지만 중간에 query문으로 객체를 조회하기 위한 JPQL이 실행될 때 해당 데이터를 조회하기 위해 JPA는 JPQL 실행과 동시에 flush를 자동으로 호출한다.
플러시 모드 옵션
em.setFlushMode(FlushModeType.COMMIT)
FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(기본값)
FlsuhModeType.COMMIT : 커밋할 때만 플러시
기본값 사용을 권장한다. (잦은 실수)
플러시 특징
영속성 컨텍스트를 비우지 않는다.
영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.
트랜잭션이라는 작업 단위가 중요한데, 커밋 직전에만 동기화하면 된다.
준영속 상태
준영속 상태는 영속 상태에서 부터 올 수 있다.
영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것을 말한다.(detached)
영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
준영속 상태로 만드는 방법
em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
em.clear() : 영속성 컨텍스트를 완전히 초기화
em.close() : 영속성 컨텍스트를 종료
'JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 - 객체지향 모델링 단방향 매핑 (0) | 2023.04.04 |
---|---|
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2023.02.26 |
[JPA] 엔티티 매핑 - 객체와 테이블 매핑, 필드와 컬럼 매핑 (0) | 2023.02.26 |
[JPA] JPA 핵심 - 영속성 컨테이너 (0) | 2023.02.24 |
[JPA] JPA 기초, 구동방식 (0) | 2023.02.24 |