준영속 엔티티
영속성 컨텍스트가 더 이상 관리하지 않는 엔티티.
ex ] 실습의 Book 객체는 이미 DB에 한번 저장되어 식별자가 존재한다. 이렇듯 임의로 만들어 낸 엔티티도,
기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다. 또한 준영속 엔티티는 엔티티값을 수정하여도 JPA가
자동으로 업데이트 해주지 않는다.
준영속 엔티티를 수정하는 2가지 방법
- 변경 감지 기능을 사용
영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법.
트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경감지(Dirty Cehcking)이
동작 해서 데이터베이스에 UPDATE SQL 실행 - 병합(merge) 를 사용
병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능이다.
병합시 동작 방식을 간단히 정리
- 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
- 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다. (병합)
- 트랜잭션 커밋 시점에 변경 감지 기능이 동작하여 데이터베이스에 UPDATE SQL이 자동 실행된다.
※ 주의 : 변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다. 병합
시 값이 없으면 null 로 업데이트 할 위험도 있다. ( 병합은 모든 필드를 교체한다. )
실무에서는 보통 업데이트 기능이 매우 제한적이라고 하는데, 병합은 모든 필드를 변경하고 데이터가 없으면 null로 업데이트를
해버리기 때문에 병합을 사용하면서 이 문제를 해결하려면, 변경 폼 화면에서 모든 데이터를 항상 유지해야 한다. 실무에서는
보통 변경 가능한 데이터만 노출하기 때문에, 병합을 사용하는 것이 오히려 번거롭다.
'JPA with 김영한' 카테고리의 다른 글
연관관계 매핑 (0) | 2021.09.04 |
---|---|
엔티티 매핑 (0) | 2021.08.31 |
JPA와 영속성 컨텍스 (0) | 2021.08.30 |
JPA의 구동방식 (0) | 2021.08.25 |
연관관계 편의 메서드 (0) | 2021.08.18 |