가 있었다 몇 가지 논의 JPA 엔티티와 여기에 대해 hashCode()
/ equals()
JPA의 엔티티 클래스에 사용되어야 구현입니다. 그들 중 대부분은 Hibernate에 의존하지만 JPA 구현 중립적으로 논의하고 싶습니다 (그런데 EclipseLink를 사용하고 있습니다).
가능한 모든 구현에는 다음과 관련하여 자체 장점 과 단점 이 있습니다.
hashCode()
/equals()
계약 적합성 에 대한 (불변)List
/Set
운영- 이든 동일한 개체 (예를 들면 서로 다른 세션에서, 느리게로드 된 데이터 구조로부터 동적 프록시)가 검출 될 수있다
- 엔티티가 분리 (또는 비 지속) 상태 에서 올바르게 작동하는지 여부
내가 알 수 있듯이 세 가지 옵션이 있습니다 .
- 재정의하지 마십시오. 에 의존
Object.equals()
하고Object.hashCode()
hashCode()
/equals()
일- 동일한 객체를 식별 할 수 없음, 동적 프록시 문제
- 분리 된 엔티티에 문제가 없음
- 기본 키를 기준으로 재정의
hashCode()
/equals()
깨졌다- 올바른 ID (모든 관리 대상 엔터티)
- 분리 된 엔터티 문제
- Business-Id (기본이 아닌 키 필드, 외래 키는 어떻습니까)를 기준으로이를 재정의하십시오 .
hashCode()
/equals()
깨졌다- 올바른 ID (모든 관리 대상 엔터티)
- 분리 된 엔티티에 문제가 없음
내 질문은 :
- 옵션 및 / 또는 프로 / 콘택 포인트가 누락 되었습니까?
- 어떤 옵션을 선택했으며 그 이유는 무엇입니까?
업데이트 1 :
" hashCode()
/ equals()
깨진"이라는 말은 연속적인 hashCode()
호출이 다른 값을 리턴 할 수 있음을 의미하며 , 이는 (정확하게 구현 된 경우) Object
API 문서 의 의미에서 손상되지 않지만 Map
, Set
또는 해시 기반 Collection
. 따라서 JPA 구현 (적어도 EclipseLink)은 경우에 따라 올바르게 작동하지 않습니다.
업데이트 2 :
답변 주셔서 감사합니다. 대부분 뛰어난 품질을 가지고 있습니다.
불행히도 실제 응용 프로그램에 가장 적합한 방법이나 응용 프로그램에 가장 적합한 방법을 결정하는 방법은 여전히 확실하지 않습니다. 따라서 질문을 계속 열어두고 더 많은 토론이나 의견이 있기를 바랍니다.
hashcode()
사용 된 필드가 equals()
변경 되지 않는 한 동일한 객체 인스턴스를 호출 하면 동일한 값을 반환해야합니다 . 즉, 클래스에 세 개의 필드가 있고 equals()
메소드가 두 필드 만 사용하여 인스턴스의 동등성을 결정하는 hashcode()
경우 해당 필드 값 중 하나를 변경하면 리턴 값이 변경 될 것으로 예상 할 수 있습니다. 이 객체 인스턴스는 더 이상 이전 인스턴스가 나타내는 값과 "같지 않습니다".