-
JPA update 변경감지개발/java 2015. 12. 28. 15:48
JPA 는 영속성 컨텍스트에 보관할때 최초 상태를 복사해서 저장해두는데 이것을 스냅샷이라한다.
그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다.
em.find() 로 member 를 찾을시 1차캐시에 저장함과 동시에 최초상태를 저장해둠.
1. 엔티티와 스법삿을 비교해서 변경된 엔티티를 찾는다.
2. 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소에 보
낸다.
3. 쓰기 지연 저장소의 SQL을 데이터베이스에 보낸다.
4. 데이터베이스 트랜잭션을 커밋한다.
변정 감지는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티에만 적용된다.
비영속, 준영속처럼 영속성 컨텍스트의 관리를 받지 못하는 엔티티는 값을 변경해도 데
이터베이스에 반영되지 않는다.
만약 수정자를 age와 name만 변경을 했을시에
동적으로 쿼리가 생성되어 age, name만 변경하는것이 아니라
JPA의 기본전략은 엔티티의 모든필드를 업데이트한다.
단점 : 데이터 전송량이 증가함
장점 : 1. 수정쿼리가 항상 같음, 애플리케이션 로딩 시점에 수정쿼리를 미리 생성해두고 재사용할수있음.
2. 데이터베이스에 동일한 쿼리를 보내면 데이터베이스는 이전에 한번 파싱된 쿼리를 재사용할수있다.
동적으로 update sql 을 보내려면 아래와 같이 전략을 바꿔준다.
@Entity
@org.hibernate.annotations.DynamicUpdate
@Table (name "Member" )
public class Member { ... }
상황에 따라 다르지만 수정 컬럼수가 약 30개 이상이 되면 정적 수정 쿼리보다 동적 수정쿼리가 빠르다고함.
한 테이블에 컬럼이 30개가 넘는 부분은 테이블 설계가 잘못되었을 가능성이 큼
'개발 > java' 카테고리의 다른 글
jstl escapeXml (0) 2016.01.19 JPA 기본키 저장 (0) 2015.12.28 엔티티의 생명주기 (0) 2015.12.28 EntityManagerFactory와 EntityManager 의 사용 (0) 2015.12.28 JPA 에서 글등록 및 수정 삭제 간단예제 (0) 2015.12.28