티스토리 뷰
hibernate naturalId를 사용하기 위해서 적용하던 중 이상한(?) 현상이 발생했습니다.
naturalId 중 enum type이 있는데 애플리케이션 실행할 때마다 다른 hashcode를 반환합니다.
@NaturalIdCache 를 사용해서 hazelcast에 저장을 했는데 애플리케이션을 구동할 때마다 다른 hashcode로 인식되어서 같은 데이터인데 계속 추가되는 현상이 발생하네요
아래 내용을 보면 지극히 정상인 상황입니다.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7190798
아래 2개의 테스트를 실행하면 다른 hashcode를 반환합니다.
@Test
void test() throws InterruptedException {
User user = new User();
System.out.println(RoleType.MANAGER.hashCode());
}
enum RoleType {
MANAGER, MEMBER
}
class User {
String id;
}
@Test
void test() throws InterruptedException {
System.out.println(RoleType.MANAGER.hashCode());
}
enum RoleType {
MANAGER, MEMBER
}
class User {
String id;
}
Object의 hashcode 문서에도 그 내용이 나와있네요
hashcode 일반 제약은 애플리케이션 실행 중에는 동일한 값을 반환하지만 동일한 애플리케이션의 다른 실행까지 일관성을 유지할 필요가 없다고 합니다.
NaturalId를 사용하면 business key를 이용해서 무조건 pk를 구하기 위해서 db query를 하는데요
이때 도메인에 @NaturalIdCache를 사용하면 캐시에 business key : pk 매핑 정보를 저장합니다.
이때 business key(natural id)에 enum이 들어가면 불필요하게 캐시 데이터가 늘어날 우려가 있습니다.
꼭 확인해보시고 개발하시면 좋을 것 같습니다.
오늘 또 하나 배웠네요 ^^
참고
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#hashCode()