JPA 엔티티에 collection을 다루기 위한 일급 컬렉션을 정의했다. 해당 일급 컬렉션을 데이터베이스에 저장할 때 비즈니스 요구사항으로 인해 converter를 사용해 특정 형식으로 저장하려고 한다. 이때 일급 컬렉션에 equals / hashCode
를 정의하지 않은 상태에서 애플리케이션을 실행하면 다음과 같은 warn 로그가 발생한다. → 일급 컬렉션과 같은 모든 값 객체를 데이터베이스에 custom converter를 사용하여 데이터 형식을 변환해서 저장하려 할 때 발생하는 로그다.
@Getter
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(columnDefinition = "json")
@Convert(converter = MenuGroupConverter.class)
private MenuGroup menuGroup;
@Getter
public static class MenuGroup {
private Set<String> menus;
}
protected Order() {
}
}
HHH000481: Encountered Java type [class com.example.jpapractice.transactional.domain.entity.Order$MenuGroup] for which we could not locate a JavaTypeDescriptor and which does not appear to implement equals and/or hashCode. This can lead to significant performance problems when performing equality/dirty checking involving this Java type. Consider registering a custom JavaTypeDescriptor or at least implementing equals/hashCode.
엔티티의 동등성 비교(equality) / 더티 체킹
을 수행할 때 값 객체의 경우 equals / hashCode를 사용한다.
따라서 성능 문제가 발생할 수 있고 이것에 대한 경고를 주는 것이다.
Hibernate에서 자바의 객체를 변환해서 저장할 때 변환 과정을 거치는데 직렬화 가능한(serializable 구현) 기본적인 자바 타입에 대한 JavaTypeDescriptor
가 JavaTypeDescriptorRegistry
에 등록되어있다.
우리가 엔티티에서 사용하는 값 객체들에 대해서는 JavaTypeDescriptor를 구현하지 않고 JavaTypeDescriptorRegistry에도 등록하지 않는다. 따라서 Hibernate가 값 객체를 JDBC 레벨에서 어떻게 다뤄야 하는지 알지 못한다.