ditry checking
) 기능 사용@Transactional
public Item updateItem(Long itemId, Book bookParam) {
Item item = itemRepository.findOne(itemId);
item.setPrice(bookParam.getPrice());
item.setStockQuantity(bookParam.getStockQuantity());
...
return item;
}
merge
) 사용@Transactional
void update(Item item) {
//item: 파리미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(item);
}
주의: 변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다. 병합시 값이 없으면 null 로 업데이트 할 위험도 있다. (병합은 모든 필드를 교체한다.)
엔티티를 변경할 때는 항상 변경 감지를 사용하자
setter
없이 바로 추적할 수 있는 메서드 만들자.(유지보수를 위해서)