JPA - 변경 감지와 병합 (merge)
2020. 11. 5. 18:18ㆍ개인공부/JPA
준영속 엔티티?
영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.
(여기서는 itemService.saveItem(book) 에서 수정을 시도하는 Book 객체다. Book 객체는 이미 DB
에 한번 저장되어서 식별자가 존재한다. 이렇게 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준
영속 엔티티로 볼 수 있다.)
준영속 엔티티를 수정하는 2가지 방법
- 변경감지 기능 사용
- 병합(merge) 사용
변경감지 기능 사용
@Transactional
public void updateItem(Long itemId, Book param){
Item findItem = itemRepository.findOne (itemId); // 영속상태
findItem.setPrice(param.getPrice());
findItem.setName (param.getName ());
findItem.setStockQuantity (param.getStockQuantity ());
}
@Transactional로 인해 트랜잭션이 커밋됨, 커밋되면 jpa는 플러시를 날림
찾아서 바뀐걸 찾아서(여기선 set된것들) 해당 내용을 update 해버림.
여기까지가 변경감지기능에 의해 준영속 엔티티를 수정하는 방법
<강의중에 설명하신 부분>
영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법
트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)
이 동작해서 데이터베이스에 UPDATE SQL 실행
플러시란 : 영속성 컨텍스트에 있는 엔티티중에 변경된 애가 누군지 다 찾음
그래서 해결방법이 무엇인가?
merge를 안쓰면 되지~
출처 : 인프런 JPA 실전1 / 김영한 개발자님
'개인공부 > JPA' 카테고리의 다른 글
JPA - API를 만들때는 (0) | 2020.11.05 |
---|---|
JPA - 엔티티 설계시 주의점 (0) | 2020.11.02 |
JPA - 도메인작성 (0) | 2020.10.30 |