준영속 엔티티
em이, jpa가 더이상 관리하지 않는 엔티티
한번 db에 입력되어 id를 갖고 있는 엔티티, 혹은 new로 새로 만든 엔티티가 여기에 포함된다.
준영속 엔티티는 jpa가 더이상 관리하지 않기 때문에 setter를 해도 이때 준영속 엔티티는 값을 수정할 때,
- 변경감지
- 병합
같이 두가지 선택지중 하나를 골라서 사용해야한다.
변경감지(flush)
Book book = em.find(Book.class, 1L);
//TX
book.setName("adsfsdfs");
//TX commit
위와 같이 em.find로 book을 가져오고 트랜잭션 안에서 setname으로 이름을 바꾸면 커밋되면서 jpa에서 flush를 통해 update query 문을 자동 생성하여 db에 반영한다. 이를 더티 체킹, 또는 변경 감지라고 한다.
@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());
.
.
}
위 코드는 em.merge의 기능을 그대로 구현한 코드의 예 이다. 파라미터의 값으로 엔티티의 모든 값을 바꾼다. 이로 인해 트랜잭션 커밋 될때 영속성 엔티티에 반영이 된다. 이때 null값으로 바뀔수도 있기 때문에 사용에 주의해야 한다.
결론 : 실무에서는 전체 데이터를 한번에 바꿀일이 거의 없기 때문에 변경 감지를 일상화 하자.