영속성 컨텍스트가 더이상 관리하지 않은 entity.
= 제대로 database에 갔다온 객체, jpa가 식별할 수 있는 id를 가지고 있다.
파라미터로 넘어온 준영속 상태의 엔티티로 같은 엔티티를 조회해서 값을 set해주면 자동으로 spring의 @Transactional에 의해서 commit이 된다.
그럼 jpa는 flush(영속성 컨텍스트 중에서 변경된 애들이 어떤 것들이 있는지 확인)를 수행해서 db에 save한다.
준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능.
- merge()를 시행한다.
- 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다.
- 조회한 영속 엔티티(a')에 해당 엔티티 값(a)을 채워넣는다.
a의 모든 값을 a'에 밀어넣는다.- 영속 상태인 a'을 반환한다.
따라서, Item aItem = em.merge(item); 에서,
item의 값은 변경되지 않고, aItem이 영속성 컨텍스트가 관리하는 객체가 된다.
🛑주의🛑 변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할 수 잇지만, 병합을 사용하면 모든 속성이 변경된다.
따라서, 병합시 값이 없으면 null로 업데이트 할 위험도 있다.(병합은 모든 필드를 교체)
그렇게 한다면 트랜잭션 커밋 시점에 변경 감지가 실행된다.