영속성 컨텍스트가 더는 관리하지 않는 엔티티
이미 DB에 한번 저장되어 식별자가 존재하는 경우
변경 감지 기능 사용
병합(merge) 사용
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티 조회
findItem.setPrice(itemParam.getPrice()); //데이터 수정
}
트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 ➡
트랜잭션 커밋 시점에 변경 감지(Dirty Checking) 기능이 동작해서 데이터베이스에 UPDATE SQL 실행
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(item);
}
파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회
조회한 영속 엔티티(mergeMember)에 member 엔티티의 값을 채워 넣는다.
(member 엔티티의 모든 값을 mergeMember에 밀어 넣는다.)
(이때 mergeMember의 “회원1”이라는 이름이 “회원명변경”으로 바뀐다.)
❗❗ 병합 시 값이 없으면 null로 업데이트할 위험도 있다.
엔티티를 변경할 때는 항상 변경 감지를 사용하자