본문 바로가기
강의 정리/스프링 부트와 JPA 활용 1

3. 변경 감지와 병합

by 이석준석이 2021. 1. 5.

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. 파라미터로 넘어온 데이터의 식별자를 이용하여 1차 캐시에서 엔티티를 조회한다.
      1. 없으면 DB에서 가져온다.
    2. 영속상태의 엔티티를 파라미터로 넘어온 데이터로 변경한다.
@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