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 속성을 사용하지 않는다고 말하기 때문에 묻습니다.
나는 당신이 말하는 것을 이해하지만, 기술적으로 id가 0이면 실제로 동일합니다. 둘 다 unpersisted Parent 객체입니다. 위의 예제에서 두 개의 속성 (id 및 children) 만 사용하는 경우 equals() 및 hashCode()를 어떻게 구현할 것을 제안 하시겠습니까? 더 많은 부동산을 소개해야합니까? – GreenieMeanie
Hibernate가 관련되지 않은 경우에도 equals() 및 hashCode()에 사용되는 필드에서 mutator를 허용 할 수 있습니까? 누군가는 HashSet에 인스턴스를 넣고, 해시 코드에 영향을주는 필드를 변경하여 그런 식으로 설정을 해제 할 수 있습니다. 그러나 그것을 금지하는 것은 약간 가혹한 것처럼 보입니다. 나는 각각의 경우를 개별적으로 고려해야하고 서로의 장단점을 비교해야한다고 생각합니다 ... – waxwing
@ 그린 니 : 다른 소스에서 데이터를 가져오고 있다면, 가지고있는 새 객체의 전체 그래프를 만들 수 있습니다. 그들을 유지하고 최대 절전 모드를 플러시하기 전에 어딘가에 저장할 수 있습니다. 그들이 ID 0을 가지고 있다고해서 그것이 평등하다는 것을 의미하지 않는다면, 그들은 ID가 없지만 모두라는 것을 의미합니다. – Jherico