[인프런 김영한] JPA - 준영속 Entity, 수정방법 및 주의사항

2021. 3. 7. 23:46프로그래밍 언어/Spring Framework

[인프런 김영한] JPA - 준영속 Entity, 수정방법 및  주의사항


해당 글은 인프런 김영한강사님의 영상을 보고 정리한 글입니다.

김영한 인프런 : www.inflearn.com/users/@yh

 

인프런 - 김영한의 강의들을 만나보세요.

우아한형제들 개발 팀장 (전: 카카오, SK플래닛) 저서: 자바 ORM 표준 JPA 프로그래밍

www.inflearn.com


 

* 준영속 Entity

- 영속성 컨텍스트가 더는 관리하지 않는 Entity

(실전! 스프링 부트와 JPA 활용1)에서의 itemService.saveItem(book)에서 시도하는 Book 객체.

Book 객체는 이미 Db에 한번 저장되어서 식별자가 존재하기 때문이다.

임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 Entity로 볼 수 있다.)

 

* 준영속Entity를 수정하는 2가지 방법

1. 변경 감지 기능 사용(Dirty Checking)

@Transactional
public void updateItem(Long itemId, Book param) { // param : 파라미터로 넘어온 준영속 상태의 Entity
  Item findItem = itemRepository.findOne(itemId); // 같은 Entity를 조회

  findItem.setPrice(param.getPrice());
  findItem.setName(param.getName());
  findItem.setStockQuantity(param.getStockQuantity());

  // save할 필요가 없다. @Transactional에 의해서 자동으로 Commit됨
  //        itemRepository.save(findItem);

}

 

 

2. merge(병합)

private final EntityManager em;

public void save(Item item) {
  if (item.getId() == null) {
 	 em.persist(item);
  } else {
  	em.merge(item);
    //            Item merge = em.merge(item);
    // item은 준영속 상태, merge는 영속상태이다.
    // 그래서 더 사용할 께 있다면 merge 변수를 사용해야 한다.
  }
}

 

 

 

※  Merge 주의사항

만약 User(name, age, city)에 세팅을 한 뒤,

User의 city를 setCity("경기도")라고 변경 후 merge하면 기존에 있던 name과 age는 null이 된다.

즉, null 값으로 온 Data는 null로 변경된다.

 

-> Merge보다는 변경감지 기능을 사용하자.