티스토리 뷰

개발

java enum hashcode가 달라지는 현상

달리는개발자 2021. 6. 4. 16:42

hibernate naturalId를 사용하기 위해서 적용하던 중 이상한(?) 현상이 발생했습니다.

naturalId 중 enum type이 있는데 애플리케이션 실행할 때마다 다른 hashcode를 반환합니다.

@NaturalIdCache 를 사용해서 hazelcast에 저장을 했는데 애플리케이션을 구동할 때마다 다른 hashcode로 인식되어서 같은 데이터인데 계속 추가되는 현상이 발생하네요

 

아래 내용을 보면 지극히 정상인 상황입니다.

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7190798 

 

Bug ID: JDK-7190798 java enum hashcode not stable among JDK 7

 

bugs.java.com

 

아래 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() 

 

Object (Java SE 11 & JDK 11 )

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. The general contract of fi

docs.oracle.com

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함