2009-05-27 3 views
3

Hibernate/JPA Parent-Child - Parent equals()/hashCode()가 DB Id를 사용할 수 있습니까?

다음과 같이 주어집니다 :

@Entity 
public class Parent implements Serializable { 
    @Id 
    private Long id; 
    // mapped ManyToOne below... 
    private List<Child> children = new ArrayList<Child>(); 

    ... 

} 

Parent.equals() 및 Parent.hashCode()를 사용하는 것은 나쁜 습관입니까? 나는 Child.equals()와 Child.hashCode()가 Parent가 올바르게 관리하기 위해서는 "natural key"에 대해 불변 인 속성 집합을 사용해야 함을 이해한다. 그러나 Parent가 항상 최상위 객체 (즉, 어떤 연관의 반대면이 아닙니다) 인 경우 ID 만 사용하면 문제가 있습니까?

이렇게하면 원치 않는 효과가 있습니까? 부모님이 바뀌 었다고 (그리고 DB에서 갱신 될 필요가있다) Hibernate가 자식을 추가하거나 제거 할 때 Hibernate가 그것을 말할 수 없을 것이라고 생각하고 있습니다. 이 경우 Parent.equals() 및 Parent.hashCode()에 children 속성을 사용해야합니까?

Hibernate 문서가 "natural key"에 대해 @Id 속성을 사용하지 않는다고 말하기 때문에 묻습니다.

답변

5

주요 문제를 질문하고는 unpersisted 객체입니다. 이러한 객체는 모두 동일한 ID로 시작하며 이것이 평등을 제대로 비교할 수 없습니다. 개체를 컬렉션에 넣지 않아도 API를 통해 노출되면 다른 인스턴스에서 인스턴스를 만들어 컬렉션에 넣을 수 있습니다. 그런 다음 사용자는 불쾌한 버그를 발견 할 수 있습니다.

+0

나는 당신이 말하는 것을 이해하지만, 기술적으로 id가 0이면 실제로 동일합니다. 둘 다 unpersisted Parent 객체입니다. 위의 예제에서 두 개의 속성 (id 및 children) 만 사용하는 경우 equals() 및 hashCode()를 어떻게 구현할 것을 제안 하시겠습니까? 더 많은 부동산을 소개해야합니까? – GreenieMeanie

+0

Hibernate가 관련되지 않은 경우에도 equals() 및 hashCode()에 사용되는 필드에서 mutator를 허용 할 수 있습니까? 누군가는 HashSet에 인스턴스를 넣고, 해시 코드에 영향을주는 필드를 변경하여 그런 식으로 설정을 해제 할 수 있습니다. 그러나 그것을 금지하는 것은 약간 가혹한 것처럼 보입니다. 나는 각각의 경우를 개별적으로 고려해야하고 서로의 장단점을 비교해야한다고 생각합니다 ... – waxwing

+1

@ 그린 니 : 다른 소스에서 데이터를 가져오고 있다면, 가지고있는 새 객체의 전체 그래프를 만들 수 있습니다. 그들을 유지하고 최대 절전 모드를 플러시하기 전에 어딘가에 저장할 수 있습니다. 그들이 ID 0을 가지고 있다고해서 그것이 평등하다는 것을 의미하지 않는다면, 그들은 ID가 없지만 모두라는 것을 의미합니다. – Jherico

관련 문제