JPA/JPA

변경 감지와 병합(merge)

lovineff 2020. 6. 9. 10:35

준영속 엔티티

영속성 컨텍스트가 관리하지 않는 엔티티로 update해도 데이터는 변경되지 않음.

임의로 만들어낸 엔티티

Book book = new Book();
book.setId(form.getId());
book.setName(form.getName());

 

준영속 엔티티 수정하는 방법(병합 사용은 추천하지 않음)

변경 감지 기능 사용(Dirty Checking), setter 대신 함수를 이용해서 변경하도록 하라

tem findItem = itemRepository.findOne(itemId);
findItem.setPrice(bookParam.getPrice());
findItem.setName(bookParam.getName());
findItem.setStockQuantity(bookParam.getStockQuantity());

 

병합 사용

파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티 조회

조회된 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(*** 수정하려는 필드가 아닌 경우에도 수정이 된다.)

병합시 값이 없으면 null로 수정함

작업 이후 엔티티를 반환함.

Book book = new Book();
book.setId(form.getId());
book.setName(form.getName());
Entity entity = em.merge(book);

트랜잭션이 있는 서비스에 엔티티를 전달하지 말라

컨트롤러에서는 엔티티를 사용하지 말고, 엔티티 내부의 값을 파라미터로 전달해라.

'JPA > JPA' 카테고리의 다른 글

컬렉션 조회(OneToMany)  (0) 2020.06.09
OneToOne Entity  (0) 2020.06.09
JPA에서 사용하는 다양한 API  (0) 2020.06.09
JPA 의 데이터 타입 분류  (0) 2020.06.09
고아 객체  (0) 2020.06.09