[NHibernate] 컬렉션 클래스(Collections) 매핑

14842 단어 Collections

시리즈 문장


[Nhibernate] 아키텍처
[NHibernate] ISessionFactory 구성
[NHibernate] 영구화 클래스(Persistent Classes)
[NHibernate] O/R Mapping 베이스.

인용문


이 부분은 대량을 포함하지 않는다.NET 코드의 예.우리는 네가 어떻게 사용하는지 이미 알고 있다고 가정한다.NET 자체의 집합 클래스 프레임워크(.NET's collections 프레임워크)와 Set 집합의 개념.사실 만약 그렇다면, 이곳은 정말 공부할 것이 없을 것이다...한마디로 요약하자면 이미 알고 있는 지식으로 그들을 사용하라.

영구 컬렉션 클래스(Persistent Collections)


NHibernate는 System을 포함하여 다음 컬렉션의 인스턴스를 영구화할 수 있습니다.Collections.IDictionary,System.Collections.IList,lesi.Collectons.ISet과 영구적인 실체나 값의 그룹유형은 System입니다.Collections.Ilist의 속성은 "bag"의미로도 지속될 수 있습니다.
경고: 지속적인 집합에 사용되며, 집합 인터페이스를 제외하고는 이 인터페이스를 실현하는 클래스에 추가된 의미를 보존할 수 없습니다. (예:lesi.Collectons.ListSet이 가져오는 교체 순서iteration order)모든 지구화 집합은 사실상 각자 시스템에 따른다.Collections.Hashtable,System.Collections.ArrayList,lesi.Collections.HashSet의 의미는 직접 작동합니다.더욱 깊이 말하면, 집합을 포함하는 속성에 대해 말하자면, 반드시NET 유형은 인터페이스(Idictionary, Ilist 또는 ISet)로 정의됩니다.이 제한이 존재하는 이유는 당신이 모를 때 NHibernate가 당신의 IDictionary, Ilist, ISet의 실례를 그 집합의 실현으로 몰래 바꾸었기 때문이다.(그래서 당신의 프로그램에서 조심스럽게 ==조작부호를 사용합니다)
1 Cat cat = new DomesticCat();
2 Cat kitten = new DomesticCat();
3 ...
4 Iesi.Collections.ISet kittens = new Iesi.Collections.HashedSet(); 
5 kittens.Add( kitten );
6 cat.Kittens = kittens;
7 session.Save( cat );
8 kittens = cat.Kittens; // Okay, kittens collection is an ISet
9 (Iesi.Collections.HashedSet)cat.Kittens; //Error! - a NHibernate.Collections.Set not Iesi.Collections.HashedSet

집합은 값 유형에 대한 일반적인 규칙을 따른다. 인용을 공유할 수 없고, 그 안에 포함된 실체와 공존할 수 없다.밑바닥의 관련 모델이 존재하기 때문에 집합은 빈값의 의미를 지원하지 않는다.
또한 NHibernate는 null의 집합 인용과 원소가 존재하지 않는 빈 집합을 구분하지 않습니다.
집합 클래스는 지구화 대상에 인용될 때 자동으로 지구화되고 인용되지 않을 때 자동으로 삭제됩니다.만약 하나의 집합이 하나의 지구화 대상에서 다른 대상으로 전달된다면, 그 집합의 원소는 한 표에서 다른 표로 옮겨질 수 있다.너는 이것에 대해 특별히 관심을 가질 필요가 없을 것이다.네가 보통의 것을 사용하는 것과 같다.NET 집합류와 마찬가지로 NHibernate의 집합류를 사용하지만, 사용하기 전에 쌍방향 관련 의미를 이해했다고 확신해야 한다(뒤에 토론할 것이다).
집합 실례는 데이터베이스에서 대응하는 실체를 가리키는 외부 키에 따라 구별된다.이 외키는 집합의 키라고 불린다.NHibernate 프로필에서 요소를 사용하여 이 집합의 키워드를 비추십시오.
집합은 기본 유형, 사용자 정의 유형, 실체 유형, 구성 요소를 포함한 거의 모든 NHibernate 형식을 포함할 수 있습니다.중요한 정의가 하나 있다. 집합 중의 대상은'전가'의 의미(집합 자체에 전적으로 의존)를 통해 조작할 수도 있고 다른 실체를 가리키는 인용으로 자신의 생명 주기를 가질 수도 있다.집합은 다른 집합을 포함할 수 없다.이러한 포함된 원소의 유형을 집합원소 유형이라고 부른다.집합된 원소는Hibernate에서 , , , 또는 로 비친다.앞의 두 가지는 전치의 의미로 원소를 조작하고 다른 세 가지는 실체와 관련된다.
ISet과 Bag을 제외한 모든 집합 형식은 인덱스 (index) 필드가 있습니다. 이 필드는 그룹이나 IList의 인덱스나 IDictionary의 키에 비칩니다.IDictionary의 인덱스 형식은 기본 형식, 실체 유형, 심지어 조합 형식일 수 있지만 집합 형식일 수는 없습니다.배열과 IList의 인덱스는 정수(Int32)여야 합니다.NHibernate 프로필에서 , , 또는 등 요소를 사용하여 색인을 비추십시오.
집합류는 상당히 많은 종류의 비주얼을 만들어 낼 수 있으며, 많은 일반적인 관계 모델을 포함한다.우리는 서로 다른 매핑 정의를 데이터베이스 테이블로 바꾸는 방법에 대해 감성적인 인식을 가지기 위해 schema 생성 도구를 사용하는 것을 연습할 것을 권장합니다.

매핑 컬렉션


값 컬렉션 및 다중 연관(Collections of Values and Many-To-Many Associations) 일대다 연관(One-To-Many Associations)
<지연 초기화(로드 지연)(Lazy Initialization)
컬렉션 정렬
사용
양방향 연결(Bidirectional Associations)
양방향 연결을 사용하면 연결된 한쪽을 통해 다른 한쪽을 접근할 수 있습니다.NHibernate에서는 두 가지 유형의 양방향 연관이 지원됩니다.
일대다 (one-to-many):
또는 값은 한쪽에 있고 단독 값(비집합)은 다른 한쪽에 있습니다.
다대다(many-to-many)
양쪽 모두 또는 값입니다
NHibernate는 색인이 있는 집합 (Ilist, IDictionary 또는 그룹) 을 '다중' 의 양방향 원-to-many 연결으로 지원하지 않습니다. 집합이나 bag 맵을 사용해야 합니다.
양방향의 다대다 관련을 구축하려면 두 개의many-to-many를 같은 데이터베이스 테이블에 비추고 그 중 하나를 inverse로 정의하십시오. (어떤 쪽을 사용하느냐에 따라 선택할 수 있습니다.)여기에 하나의 클래스에서 그 자신과 관련된 many-to-many의 양방향 관련 예가 있다(각각의 category는 많은items를 가질 수 있고 각각의 items는 많은categories에 속할 수 있다).
 1 <class name name="NHibernate.Auction.Category, NHibernate.Auction">
 2  <id name="Id" column="ID"/>
 3  ...
 4  <bag name="Items" table="CATEGORY_ITEM" lazy="true">
 5   <key column="CATEGORY_ID" />
 6   <many-to-many class="NHibernate.Auction.Category, NHibernate.Auction" column="ITEM_ID" />
 7  </bag>
 8 </class>
 9 <class name="NHibernate.Auction.Item, NHibernate.Auction">
10  <id name="Id" column="ID" />
11  
12  <!-- inverse end -->
13  <bag name="Categories" table="CATEGORY_ITEM" inverse="true" lazy="true">
14   <key column="ITEM_ID" />
15   <many-to-many class="NHibernate.Auction.Category, NHibernate.Auction" column="CATEGORY_ID" />
16  </bag>
17 </class>

만약 연관된 반향단만 바뀌었다면, 이 변화는 지속되지 않을 것이다.이는 NHibernate가 각 양방향 연관을 위해 메모리에 두 번의 표현이 있음을 나타낸다. 하나는 A에서 B로, 다른 하나는 B에서 A로 연결된다.생각해보면.NET 대상 모델, 우리가 어떻게 있는지.NET에서 다대다 관계를 만드는 것은 당신을 더욱 쉽게 이해할 수 있습니다.
1 category.Items.Add( item ); // The category now "knows" about the relationship
2 item.Categories.Add( category ); // The item now "knows" about the relationship
3 session.Update( item ); // No effect, nothing will be saved!
4 session.Update( category ); // The relationship will be saved

비역방향단은 메모리의 표시를 데이터베이스에 저장하는 데 사용됩니다. 만약에 양쪽 끝이 바뀌면 우리는 여분의 INSERT/UPDATE를 진행하고 외부 키 충돌을 받을 수 있습니다!이 점은 쌍방향의 일대다 관련도 마찬가지다.일대다 양방향 연결을 구축하려면 일대다 연결을 같은 테이블의 필드에 다대일 연결로 비추고, '다' 의 한 쪽에서 inverse='true '를 정의할 수 있습니다.
 1 <class name="Eg.Parent, Eg>
 2  <id name="Id" column="id" />
 3  ...
 4  <set name="Children" inverse="true" lazy="true">
 5   <key column="parent_id" />
 6   <one-to-many class="Eg.Child, Eg" />
 7  </set>
 8 </class>
 9 <class name="Eg.Child, Eg">
10  <id name="Id" column="id" />
11  ....
12  <many-to-one name="Parent" class="Eg.Parent, Eg" column="parent_id" />
13 </class>

'1'이라는 측면에서 inverse='true'를 정의하면 등급 연결 작업에 영향을 주지 않고 양자는 서로 다른 개념이다.
트리플 연관(Ternary Associations)
이기종 연관(Heterogeneous Associations)

총결산


집합의 지속화에 대해 어떻게 집합을 비추는지 소개한다.
본문은 《NHibernate 중국어 문서》에서 왔다.
 

좋은 웹페이지 즐겨찾기