준영속 엔티티를 수정하는 2가지 방법

⭐️준영속 엔티티란?
JPA에서 영속성 컨텍스트에서 분리된 엔티티 즉, 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 

영속성 컨텍스트는 JPA가 엔티티를 관리하는 곳으로, 영속 상태(Persistent)인 엔티티는 영속성 컨텍스트에 저장되어 관리된다.

영속 상태인 엔티티가 영속성 컨텍스트에서 분리되면 준영속 상태(Detached)가 된다. 준영속 상태의 엔티티는 더 이상 영속성 컨텍스트에서 관리되지 않으며, 영속성 컨텍스트에서 분리된 이후에는 엔티티를 수정하더라도 JPA는 이를 인식하지 못한다.

 

준영속 엔티티를 수정하는 방법은 변경 감지 및 병합 사용하는 방법이 있다.

 

 

변경 감지

영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법으로 트랜잭션 안에서 엔티티를 다시 조회 후 변경하고 싶은 필드의 값을 변경하면 트랜잭션 커밋 시점에 변경을 감지해 데이터베이스에 UPDATE SQL 실행된다. 
트랜잭션 커밋 시점에 변경 감지을 더티체킹(Dirty Checking)이라고 한다.

@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
     Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를
    조회한다.
     findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}

 

 

병합 사용

병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능이다.

 

참고: 책 자바 ORM 표준 JPA 프로그래밍 3.6.5

병합 동작 방식

  1. merge() 를 실행한다
  2. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다.  
    • 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고, 1차 캐시에 저장한다.
  3. 조회한 영속 엔티티( mergeMember )에 member 엔티티의 값을 채워 넣는다. (member 엔티티의 모든값을 mergeMember에 밀어 넣는다. 이때 mergeMember의 “회원1”이라는 이름이 “회원명변경”으로 바뀐다.)
  4. . 영속 상태인 mergeMember를 반환한다

 

병합시 동작 방식을 간단히 정리

1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(병합한다.)
3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행

 


 

 

정리

준영속 엔티티를 수정하는 2가지 방법

  1. 변경 감지 기능
  2. 병합

 

변경 감지 기능은 트랜잭션 커밋 시점에 영속엔티티의 변경을 감지해 데이터베이스에 UPDATE SQL 실행

병합은 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회하고 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행

 

 

 

복사했습니다!