ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.