Hibernate 는 Entity 조회시에 조회한 Entity 의 복제본을 저장하고 이후에 equals
로 각 필드를 비교해서 dirty checking 을 한다.
따라서
custom value object를 필드로 사용하는 경우 특히 JPA Converter 사용시에 equals/hashCode 를 올바로 구현하지 않으면 dirty checking 시 복제된 객체의 reference 주소와 entity 필드의 기존 reference 주소를 비교하면서 dirty 상태로 표시되고 이로 인해 update 가 발생할 수 있다.
@Embeddable
의 경우에는 class 가 아닌 다시 그 각 필드에 대해 equals 를 수행한다. 따라서 @Embeddable
클래스의 각 필드를 구성하는 클래스에 equals/hashCode
가 구현돼 있어야 한다.
애초에 Java 에서 불변 객체가 확실한 LocalDate
, LocalDateTime
등은 복사하지 않는다고 함.