작성
·
264
답변 1
2
안녕하세요. 원석나님, 공식 서포터즈 codesweaver입니다.
.
1. commit이 실행되는 순간 우선 영속성 컨텍스트에 있는 객체와 스냅샷의 비교가 이루어 집니다. 이를 변경감지(Dirty Checking) 이라고 합니다.
2. 그리고 변경된 항목이 있다면 이를 반영하는 쿼리를 '쓰기지연 SQL 저장소'에 추가 합니다.
3. 이제 쓰기지연 SQL 저장소에 있는 쿼리들이 flush() 되어 DB로 전송, 반영됩니다.
4. 이후 DB의 Transaction이 commit 되며 실 테이블에 반영됩니다.
.
추가적으로, em.persist(객체) 를 하는 순간 엔티티의 @Id 생성 정책이 IDENTITY일 경우는 그 즉시 Insert 쿼리가 날아가게 됩니다. 영속성 컨텍스트는 기본적으로 ID와 객체의 쌍으로 관리되기에 ID가 반드시 필요합니다. 그러나 @Id 정책이 IDENTITY이고 데이터베이스가 MariaDB나 MySQL인 경우 아이디는 auto_increment 로 생성하게 됩니다. 이는 우선 데이터를 데이터베이스에 입력한 이후에 알 수 있는 값입니다. 따라서, 이런 경우는 쓰기지연 SQL저장소를 이용하지 않고 persist()가 호출되는 즉시 쿼리를 전송하게 됩니다.
.감사합니다.
안녕하세요 원석나님!
.
더티 체킹은 엔티티를 최초 영속성컨텍스트에 등록했을때의 상태(=스냅샷)가 기준이 됩니다. 트랜잭션이 commit 되는 순간 이 스냅샷과 다른 부분을 모두 더티체킹 하게 됩니다. (수정, 삭제 등등)
.
persist의 경우 영속성으로 관리되지 않던 엔티티를 영속성으로 등록하는 것이기에 더티체킹이 이루어지지는 않습니다.
.
혹시, 어떤 엔티티를 persist()한 이후 이 엔티티의 내용을 변경하고 다시 persist() 하는경우를 말씀하시는것이라면, 이 경우는 persist()를 두 번 할 이유가 없습니다. 어차피 트랜잭션이 끝나는 순간 더티체킹을 통해 엔티티의 변경사항이 DB와 동기화 될것이기 떄문입니다.
.
감사합니다.
비영속 상태 엔티티를 persist해서 영속상태로 만든 후 commit하면 더티체킹을 안하고
비영속 상태 엔티티를 persist해서 영속상태로 만든 후 값을 수정하고 commit을 만나면 더티체킹을 하겠군요 !!
답변 너무나 감사드립니다 ㅎㅎ 잘 해결되었습니다 !
답변 너무나 감사드립니다 !
추가질문이 있는데요 !
더티체킹이 이루어지는경우는 기존 영속 엔티티가 변경되었을때 뿐만아니라 persist를 했을때도 이루어지는건가요?
즉 영속 컨텍스트에 변화가 있을경우 모두 일어나는건지 궁금합니다(저장 , 수정, 삭제)