NHibernate 매핑 파일에서 목록, 세트 및 백의 차이점은 무엇입니까? 각각은 .NET 컬렉션과 어떤 관련이 있습니까?
답변
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”를 수동으로 설정해야합니다.
답변
가장 큰 차이점은 목록은 목록에서의 위치에 따라 색인화 된 요소에 대한 암시 적 순서가 있다는 것입니다. 세트와 가방은 일반적으로 비교기 또는 해당 항목이 DB에서 나올 때 적용되는 order by 절에 의해 “정렬”될 수 있습니다. 개인적으로 Bag을 사용한 적이 없습니다. 원하는 데이터가 순차적으로 주문된다는 것을 알고 있으면 List를 사용하고 그렇지 않으면 Set를 사용합니다.
답변
설정하지 않으면 반복되는 요소를 가질 수 있습니다. 새 요소를 추가하려고하면 이미 컬렉션에있는 각 요소를 추가 한 요소와 비교 (Equals 메서드 사용)하고, 하나가 참이면 요소가 추가되지 않습니다.