NHibernate의 목록 대 세트 대 가방


109

NHibernate 매핑 파일에서 목록, 세트 및 백의 차이점은 무엇입니까? 각각은 .NET 컬렉션과 어떤 관련이 있습니까?

답변:


230

NHibernate 의미론 :

  1. 목록 : 주문 된 엔티티 컬렉션, 중복 허용. IList코드 에서 .NET 을 사용하십시오 . 인덱스 열은 NHibernate에서 매핑되어야합니다.

  2. 설정 : 고유 엔티티의 정렬되지 않은 컬렉션, 중복은 허용되지 않습니다. 사용 Iesi.Collection.ISet코드 (NH v4 이전) 또는 System.Collections.Generic.ISet(NH V4 +). 중복의 비즈니스 정의 를 재정의 GetHashCode하고 Equals표시하는 것이 중요합니다 . 정렬 기준을 정의하거나 결과를 생성하는 비교자를 정의하여 정렬 할 수 있습니다 SortedSet.

  3. 가방 : 항목의 순서가 지정되지 않은 목록, 중복이 허용됩니다. ICollection<T>코드 에서 .NET 을 사용하십시오 . 목록의 인덱스 열은 매핑되지 않으며 NHibernate에서 인식되지 않습니다.


Re : # 2, ISet대신 일반을 사용할 수 Iesi없습니까?
Sergei Tachenov

@SergeyTachenov : 가능한 대답 은 stackoverflow.com/questions/9222058/… 을 참조하십시오 . 이 답변이 작성 될 때 ISET는 .NET의 일부가 아니었다
마이클 가투소

NHibernate 4 이후이 질문에 대한 가장 인기있는 대답은 '예'입니다. 따라서이 질문도 수정해야 할 수도 있습니다.
Sergei Tachenov

21

NHibernate의 이러한 모든 객체는 이러한 추상 데이터 유형 (ADT)의 다른 구현과 정확히 동일합니다. 나는 다른 것들에 대한 이름이 얼마나 일반적인지 때문에 온라인에서 세트와 가방을 찾는 것이 얼마나 어려운지 놀랐습니다. 그래서 여기에 링크와 설명을 나열했습니다.

자세한 내용은 목록 , 세트가방을 참조하십시오.

일반적인 규칙은 다음과 같습니다.

목록 은 기본적으로 정렬되어 있습니다. 인덱스로 객체를 꺼내고 싶거나 for루프를 통해 foreach루프를 이상하게 좋아하는 경우에 사용 합니다. 연결 목록 에서 필요한 순서대로 액세스 할 필요는 없습니다 . 이 ADT는 중복을 허용합니다.

참고하십시오! 목록은 BryanD가 그의 답변에서 언급 한대로 정렬되어 있지만 명령별로 순서를 지정하지 않는 한 HQL 쿼리를 실행할 때 데이터베이스에서 예상하는 순서대로 있어야한다는 말은 전혀 없습니다. 이 때문에 일부 사람들은 대신 세트 또는 가방을 사용하기를 좋아하여 주문되는 착각을 일으키지 않습니다. 내가 이것을 말하지만, NHibernate가 실행하는 쿼리에서 찾은 순서대로 목록에 추가되기 때문에 대부분의 경우 가시적 인 순서로 표시됩니다.

집합 은 기본적으로 정렬 되어 있지 않으므로 인덱스를 통해 직접 변수에 액세스 할 수 없습니다. 집합은 기본적 으로 개체의 고유성을 유지하는 위의 세 가지 중 유일한 ADT 입니다. 중복을 포함하지 않아야하는 경우 컬렉션이있는 경우 유용합니다.

Bag (또는 Multisets )은 위의 링크에서 볼 수 있듯이 그 안의 개체가 다른 개체의 복제가 될 수 있도록하는 Set 유형입니다. 목록 순서는 무시 될 수 있으므로 일반적으로 사용되지 않으므로 Bag으로 처리됩니다.

이것들이 NHibernate에서 사용되는 방법과 관련하여, 여기에서 선택한 ADT에 따라 데이터베이스에서 아무것도 가져 오지 않습니다. 다른 ADT를 선택해야하는 용도로 사용하려는 것입니다.

개인적으로 저는 일반적으로 자식 개체가 고유해야하고 순서가 문제가되지 않기 때문에 대부분의 경우에 세트를 사용합니다. 예를 들어 시간에 따라 정렬하려는 개체 그룹이있는 목록을 사용하지만이 순서를 달성하려면 HQL 쿼리에서 "order by"를 수동으로 설정해야합니다.


2
목록 수정-NHibernate 매핑 파일의 목록을 사용하려면 인덱스 열을 매핑해야합니다. 이렇게하면 목록이 입력 된 순서대로
Michael Gattuso

@Michael Gattuso 좋은 점, 위의 답변에서 매핑 파일의 실제 컬렉션 사양이 아니라 HQL 쿼리 (따라서 '주문 기준'주석)에 대해 이야기하고 있다고 언급 했어야했습니다.
Jay

bag 사용의 한 가지 이점은 새 요소를 추가 할 때 데이터베이스에서로드 할 필요가 없다는 것입니다. 확인할 중복 항목이 없으며 결정할 순서도 없습니다.
tvaananen

1

가장 큰 차이점은 목록은 목록에서의 위치에 따라 색인화 된 요소에 대한 암시 적 순서가 있다는 것입니다. 세트와 가방은 일반적으로 비교기 또는 해당 항목이 DB에서 나올 때 적용되는 order by 절에 의해 "정렬"될 수 있습니다. 개인적으로 Bag을 사용한 적이 없습니다. 원하는 데이터가 순차적으로 주문된다는 것을 알고 있으면 List를 사용하고 그렇지 않으면 Set를 사용합니다.


0

설정하지 않으면 반복되는 요소를 가질 수 있습니다. 새 요소를 추가하려고하면 이미 컬렉션에있는 각 요소를 추가 한 요소와 비교 (Equals 메서드 사용)하고, 하나가 참이면 요소가 추가되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.