영속성 컨텍스트에는 변경 감지(Dirty Checking)와 병합(Merge) 기능이 존재합니다. Entity의 필드값을 수정한다는 공통점이 있으나, 주의해야 할 차이점 또한 존재합니다. 이 글에서는 준영속 상태의 Entity에 접근하는 관점에서 설명합니다. 변경 감지(Dirty Checking) 변경 감지란 영속성 컨텍스트가 관리하는 영속 상태의 Entity의 필드 값을 수정합니다. (영속 상태라 함은 Entity가 식별자 값(ID)을 가지고 있음을 말합니다) 영속성 컨텍스트를 Flush하는 시점에 Entity와 SNAPSHOT을 비교하여 변경된 값을 추적합니다. 변경된 필드가 존재한다면 수정 쿼리를 작성하여 쓰기 지연 SQL 저장소에 보관하였다가 Flush 시점에 DB에 업데이트됩니다. 변경 감지..
EntityManager를 통해 비영속 상태의 Entity를 영속 상태의 Entity로 변경할 수 있습니다. 이때 사용되는 메서드는 merge()입니다. 그렇다면 비영속 -> 영속 상태로 변경하는 과정은 어떻게 될까요? 차근차근 알아봅시다. 준영속 상태 준영속 상태란 EntityManager가 관리하지 않는 Entity라고 생각하면 됩니다. 관리되지 않기 때문에 해당 엔티티의 값을 변경하더라도 DB에 반영되지가 않습니다. 준영속 상태의 특징은 다음과 같습니다. 비영속 상태에 가깝다 영속성 컨텍스트에 의해 관리되지 않으므로 1차 캐시, 쓰기 지연 SQL, 변경 감지 등을 지원하지 않습니다 식별자 값을 가지고 있다 준영속 상태가 되기 전에 영속 상태이었기 때문에 식별자 값을 가지고 있습니다. 이 식별자 값은..
Embedded 값 타입을 다루고 있는데 오류가 발생했다. javax.persistence.RollbackException: Error while committing the transaction at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) at jpay.jpastudy.JpastudyApplication.main(JpastudyApplication.java:44) Caused by: java.lang..