0. Merge vs Dirty Checking
준영속 엔티티란?
- 영속성 컨텍스트가 더이상 관리하지 않는 엔티티
- 식별자를 갖고 있지만, 영속성 컨텍스트가 관리하지 않는 엔티티
1. Dirty Checking (변경 감지)
- 해당 코드가 tx.commit() 이 될 때, 영속성 컨텍스트가 변경감지를 통해 데이터베이스에 반영
@Transactional
public void updateItem(Long itemId, BookForm form) {
Item findItem = itemRepository.findOne(itemId);
findItem.setPrice(form.getPrice());
findItem.setName(form.getName());
findItem.setStockQuantity(form.getStockQuantity());
//...
}
2. Merge
- merge() :
- 파라미터로 넘어온 데이터의 식별자를 이용하여 1차 캐시에서 엔티티를 조회한다.
- 없으면 DB에서 가져온다.
- 영속상태의 엔티티를 파라미터로 넘어온 데이터로 변경한다.
- 파라미터로 넘어온 데이터의 식별자를 이용하여 1차 캐시에서 엔티티를 조회한다.
@Transactional
public void saveItem(Item item) {
if(item.getId() == null) {
em.persist(item);
} else {
em.merge(item);
}
}
주의점
- 모든 속성이 넘어온 것을 기반으로 다 변경된다.
- null 로 변경되는 것을 유의해야 한다.
'강의 정리 > 스프링 부트와 JPA 활용 1' 카테고리의 다른 글
2. 엔터티 설계시 주의점 (0) | 2020.12.26 |
---|---|
1. 환경설정 (0) | 2020.12.25 |