← 질문 목록
#136깊이 0
수정 메서드 없이 UPDATE가 나가는 이유는?
영속성 컨텍스트가 관리 엔티티의 최초 상태와 현재 상태를 flush 때 비교하기 때문이다. 달라진 속성이 있으면 UPDATE SQL을 만든다.
조회→컨텍스트
엔티티와 최초 상태를 둔다
코드→엔티티
필드를 바꾼다
커밋→flush
최초 상태와 비교한다
flush→DB
차이가 있으면 UPDATE한다
flush는 커밋 직전이나 쿼리 실행 전에 일어날 수 있다. SQL이 보였다는 사실과 커밋됐다는 사실은 다르며 롤백하면 변경은 사라진다.
관리 상태인 엔티티만 대상이다. detach나 clear 뒤의 객체는 바꿔도 감지되지 않는다. merge는 전달 객체가 아니라 반환된 관리 객체를 갱신한다.
벌크 UPDATE는 영속성 컨텍스트를 건너뛴다. 이미 관리 중인 객체가 낡을 수 있어 flush 후 clear하거나 다시 조회하는 전략이 필요하다.