@OneToMany List <> 대 Set <> 차이점


94

내가 사용하면 차이가 있습니까

@OneToMany
public Set<Rating> ratings;

또는 내가 사용한다면

@OneToMany
public List<Rating> ratings;

둘 다 정상적으로 작동합니다. 목록과 집합의 차이점을 알고 있지만 이것이 최대 절전 모드 (또는 오히려 JPA 2.0)가 처리하는 방식에 차이가 있는지는 모르겠습니다.

답변:


109

지정된 인덱스 열이없는 경우 목록은 Hibernate에 의해 bag으로 처리됩니다 (특정 순서 없음).

Hibernate를 처리 할 때 한 가지 주목할만한 차이점은 단일 쿼리에서 두 개의 다른 목록을 가져올 수 없다는 것입니다. 예를 들어 Person연락처 목록과 주소 목록 이있는 엔터티가있는 경우 단일 쿼리를 사용하여 모든 연락처와 모든 주소가있는 사람을로드 할 수 없습니다. 이 경우 해결책은 두 개의 쿼리 (카티 전 곱을 피함)를 만들거나 하나 이상의 컬렉션에 a Set대신 a를 사용하는 것입니다 List.

그것은 당신이 정의 할 때 최대 절전 모드로 설정을 사용하는 것이 어렵다 equalshashCode엔티티와 엔티티의 불변의 기능 키가 없습니다.


3
목록에서 발생하는 작업에 대한 자세한 내용은 stackoverflow.com/q/1995080/2495717을 참조하십시오 .
ben3000

31

List를 사용하는 경우 getter 함수에서 'Order BY'절을 지정할 수 있습니다. 세트로는 할 수 없습니다. order by 절은 부분적인 EJBQL을 포함 할 수 있습니다. 예를 들면

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

이 필드를 비워두면 목록이 기본 키 값을 기준으로 오름차순으로 정렬됩니다.


19
그것은 내 Hibernate 문서를 위해 스크램블링을 보냈기 때문에 : 당신 문서에 설명 대로 @Sort그냥 사용할 수 SortedSet있다 .
mabi

그러나 SortedSet을 사용하면 비교기로 정렬하므로 데이터베이스의 "order by"로 정렬 할 수있는 방법이 없습니다.
samir105

오래된 답변이기 때문에 명확히하고 싶습니다. 현재 우리 @OrderBySet. 그 아래에서 Hibernate는를 OrderedSetType인스턴스화하는 것을 사용 LinkedHashSet하므로 순서가 유지됩니다. 추가 LinkedHashSet로 일관성을 위해 엔티티 에서 사용하는 것이 좋습니다 . 출처 : discourse.hibernate.org/t/…
Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.