2012-04-02 3 views
0

JPA를 사용할 때 엔티티에 대해 hashCode()/equals()를 구현해야한다는 것을 읽었습니다. 예를 들어 Eclipse에는 클래스에 대한 메소드를 생성하는 좋은 기능이 있습니다.관련된 엔티티에 대한 hashCode() 메소드

그러나 어떤 필드를 선택해야합니까? 롱 아이디를 읽었습니다. 엔티티의 필드는 좋은 생각이 아닙니다. (right ?, why?) hashCode()/equals() 메소드에서 비즈니스 키 (엔티티를 식별하는 데 사용할 수있는 엔터티의 일부 필드)를 사용해야합니다.

A와 B 사이의 1 : n 관계 ... hashcode() 메서드에서 이러한 참조를 사용하는 것이 좋습니다. 이렇게하면 가끔 java.util.ConcurrentModificationException 또는 Stackoverflow 예외가 발생합니다. 콜렉션 변수는 어떻게됩니까? 나는 내 hashcode() 함수를 사용해서는 안된다고 생각합니다 ... 누군가가 내게 힌트를 줄 수 있습니까?

답변

0

개체를 고유하게 식별 할 수있는 필드를 가능한 한 적게 사용하는 것을 고려하십시오. 사람이라면 첫 번째, 중간 및 성이 될 수 있습니다. 또는 미국인 인 경우 사회 보장 번호. 테이블에 중복 엔티티가 포함될 수없는 한 DB ID를 사용하는 데 문제가 없습니다. 일반적으로 객체의 신원은 객체의 신원 (1 : n 관계)이 아니라 로컬 필드 만 확인하면됩니다.

+0

고맙습니다. :) 개체가 만들어 질 때 (그리고 데이터베이스에 유지되지 않을 때)이 필드가 null이 될 것이므로 ID 기본 키를 사용하면 안됩니다. 그래서 모든 새로운 객체는 다른 새로운 객체와 동일 할 것입니다. 문제는 : 엔티티에 고유 한 것으로 간주되는 대체 필드가없는 경우 어떻게해야합니까? 이드가 아니라면 어떤 필드를 사용해야합니까? – Moonlit

+0

추상적으로, 두 개체가 어떻게 평등하다고 생각하십니까? 즉 DB를 사용하지 않아 ID가없는 경우 두 콩의 평등을 어떻게 정의할까요? 모든 분야를 점검하나요? 무슨 일이 일어나고 있는지 더 잘 이해할 수 있도록 질문에 객체의 구조를 게시해야하는 것처럼 보입니다. –

0

같음 및 해시 코드 방법은 항상 기본 키 또는 비즈니스 키 중 하나에서 구현되어야하며 이는 영구적 인 관리자의 요구 사항을 준수하려는 경우 필요합니다. Check here

0

당신은 당신이 ^의 조합을 할 수

고유 그 숫자 예를 -ing를 얻기 위해 해시에 자신의 논리를 구현할 수 있습니다 (XOR - 보내고), 즉 (클래스의 인스턴스 변수를 만지작 그들의 비트), 따라 아마 소수로 그들을 곱하면됩니다.

관련 문제