답변:
NHibernate 의미론 :
목록 : 주문 된 엔티티 컬렉션, 중복 허용. IList
코드 에서 .NET 을 사용하십시오 . 인덱스 열은 NHibernate에서 매핑되어야합니다.
설정 : 고유 엔티티의 정렬되지 않은 컬렉션, 중복은 허용되지 않습니다. 사용 Iesi.Collection.ISet
코드 (NH v4 이전) 또는 System.Collections.Generic.ISet
(NH V4 +). 중복의 비즈니스 정의 를 재정의 GetHashCode
하고 Equals
표시하는 것이 중요합니다 . 정렬 기준을 정의하거나 결과를 생성하는 비교자를 정의하여 정렬 할 수 있습니다 SortedSet
.
가방 : 항목의 순서가 지정되지 않은 목록, 중복이 허용됩니다. ICollection<T>
코드 에서 .NET 을 사용하십시오 . 목록의 인덱스 열은 매핑되지 않으며 NHibernate에서 인식되지 않습니다.
NHibernate의 이러한 모든 객체는 이러한 추상 데이터 유형 (ADT)의 다른 구현과 정확히 동일합니다. 나는 다른 것들에 대한 이름이 얼마나 일반적인지 때문에 온라인에서 세트와 가방을 찾는 것이 얼마나 어려운지 놀랐습니다. 그래서 여기에 링크와 설명을 나열했습니다.
자세한 내용은 목록 , 세트 및 가방을 참조하십시오.
일반적인 규칙은 다음과 같습니다.
목록 은 기본적으로 정렬되어 있습니다. 인덱스로 객체를 꺼내고 싶거나 for
루프를 통해 foreach
루프를 이상하게 좋아하는 경우에 사용 합니다. 연결 목록 에서 필요한 순서대로 액세스 할 필요는 없습니다 . 이 ADT는 중복을 허용합니다.
참고하십시오! 목록은 BryanD가 그의 답변에서 언급 한대로 정렬되어 있지만 명령별로 순서를 지정하지 않는 한 HQL 쿼리를 실행할 때 데이터베이스에서 예상하는 순서대로 있어야한다는 말은 전혀 없습니다. 이 때문에 일부 사람들은 대신 세트 또는 가방을 사용하기를 좋아하여 주문되는 착각을 일으키지 않습니다. 내가 이것을 말하지만, NHibernate가 실행하는 쿼리에서 찾은 순서대로 목록에 추가되기 때문에 대부분의 경우 가시적 인 순서로 표시됩니다.
집합 은 기본적으로 정렬 되어 있지 않으므로 인덱스를 통해 직접 변수에 액세스 할 수 없습니다. 집합은 기본적 으로 개체의 고유성을 유지하는 위의 세 가지 중 유일한 ADT 입니다. 중복을 포함하지 않아야하는 경우 컬렉션이있는 경우 유용합니다.
Bag (또는 Multisets )은 위의 링크에서 볼 수 있듯이 그 안의 개체가 다른 개체의 복제가 될 수 있도록하는 Set 유형입니다. 목록 순서는 무시 될 수 있으므로 일반적으로 사용되지 않으므로 Bag으로 처리됩니다.
이것들이 NHibernate에서 사용되는 방법과 관련하여, 여기에서 선택한 ADT에 따라 데이터베이스에서 아무것도 가져 오지 않습니다. 다른 ADT를 선택해야하는 용도로 사용하려는 것입니다.
개인적으로 저는 일반적으로 자식 개체가 고유해야하고 순서가 문제가되지 않기 때문에 대부분의 경우에 세트를 사용합니다. 예를 들어 시간에 따라 정렬하려는 개체 그룹이있는 목록을 사용하지만이 순서를 달성하려면 HQL 쿼리에서 "order by"를 수동으로 설정해야합니다.
ISet
대신 일반을 사용할 수Iesi
없습니까?