영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말합니다.
해당 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용하지 못합니다.
임의로 만들어낸 엔티티도 기존 식별자(id)를 가지고 있는 경우네 준영속성 엔티티로 볼 수 있습니다.
@Transactional
void update(Item itemParam) {
//itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회.
findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}
영속성 컨텍스트에서 엔티티를 다시 조회한 후 데이터를 수정하는 방법.
트랜잭션 커밋 시점에 변경이 감지(Dirty Checking)되고 이 동작에서 DB에 UPDATE Query를 실행한다.
@Transactional
void update(Item item) {
//itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(item); //병합사용
}
병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용한다.
-> merge()하는 값으로 아예 대체해버린다.
변경 감지 기능을 사용하면 원하는 속성만 변경이 가능하다.
하지만 병합의 경우 모든 속성이 변경된다.
엔티티를 변경 할 때는 변경 감지 기능을 사용하자.
트랜잭션이 있는 서비스 계층의 식별자(id)와 변경할 데이터를 명확하게 전달하자!
사용하지 말아야 할 이유는?
병합시 특정 속성에 값이 없으면 null로 업데이트 되기 때문에.