NHibernate의 Collection Type은 총 4가지를 가지고 있다.
다른 성격을 가지고 있기 때문에 어떤 Collection Type을 사용해야지 될지 고민해야지 된다.
일반적인 Table 구조에서는 Set을 사용하는 것이 EF나 MSLINQ와 동일하게 사용을 할 수 있다.
각각의 hbm.xml은 다음과 같다.
1. Bag
2. Set
3. List
4. Map
다른 성격을 가지고 있기 때문에 어떤 Collection Type을 사용해야지 될지 고민해야지 된다.
Bag | Set | List | Map | |
중복값 허용 | Yes | No | Yes | Key must be unique. Value may be duplicated. |
Ordering | No | No | Yes | No |
Type | IList | Iesi.Collections.ISet | IList | IDictionary |
Bi-Direction | Yes | Yes | No | No |
일반적인 Table 구조에서는 Set을 사용하는 것이 EF나 MSLINQ와 동일하게 사용을 할 수 있다.
각각의 hbm.xml은 다음과 같다.
1. Bag
01.
<!--?xml version="1.0" encoding="utf-8" ?-->
02.
<
hibernate-mapping
xmlns
=
"urn:nhibernate-mapping-2.2"
assembly
=
"NHibernate.First"
namespace
=
"NHibernate.First.Models"
>
03.
<
joined-subclass
name
=
"Movie"
extends
=
"Product"
>
04.
<
key
column
=
"Id"
></
key
>
05.
<
property
name
=
"Director"
></
property
>
06.
<
idbag
name
=
"ActorRoles"
table
=
"ActorRole"
>
07.
<
collection-id
column
=
"Id"
type
=
"Int64"
>
08.
<
generator
class
=
"hilo"
>
09.
</
generator
></
collection-id
>
10.
<
key
column
=
"MovieId"
></
key
>
11.
<
many-to-many
class
=
"ActorRole"
></
many-to-many
>
12.
</
idbag
>
13.
</
joined-subclass
>
14.
<
class
name
=
"ActorRole"
>
15.
<
id
name
=
"Id"
>
16.
<
generator
class
=
"guid.comb"
></
generator
>
17.
</
id
>
18.
<
property
name
=
"Actor"
not-null
=
"true"
></
property
>
19.
<
property
name
=
"Role"
not-null
=
"true"
></
property
>
20.
<
many-to-one
class
=
"Movie"
name
=
"Movie"
column
=
"MovieId"
>
21.
</
many-to-one
></
class
>
22.
</
hibernate-mapping
>
2. Set
01.
<!--?xml version="1.0" encoding="utf-8" ?-->
02.
<
hibernate-mapping
xmlns
=
"urn:nhibernate-mapping-2.2"
assembly
=
"NHibernate.First"
namespace
=
"NHibernate.First.Models"
>
03.
<
joined-subclass
name
=
"Movie"
extends
=
"Product"
>
04.
<
key
column
=
"Id"
></
key
>
05.
<
property
name
=
"Director"
></
property
>
06.
<
set
name
=
"ActorRoles"
>
07.
<
key
column
=
"MovieId"
></
key
>
<!-- ActorRole Table에 삽입될 FK 설정 -->
08.
<
one-to-many
class
=
"ActorRole"
>
<!-- Class 설정-->
09.
</
one-to-many
></
set
>
10.
</
joined-subclass
>
11.
<
class
name
=
"ActorRole"
>
12.
<
id
name
=
"Id"
>
13.
<
generator
class
=
"guid.comb"
></
generator
>
14.
</
id
>
15.
<
property
name
=
"Actor"
not-null
=
"true"
></
property
>
16.
<
property
name
=
"Role"
not-null
=
"true"
></
property
>
17.
<
many-to-one
class
=
"Movie"
name
=
"Movie"
column
=
"MovieId"
>
18.
</
many-to-one
></
class
>
19.
</
hibernate-mapping
>
3. List
01.
<
hibernate-mapping
xmlns
=
"urn:nhibernate-mapping-2.2"
assembly
=
"NHibernate.First"
namespace
=
"NHibernate.First.Models"
>
02.
<
joined-subclass
name
=
"Movie"
extends
=
"Product"
>
03.
<
key
column
=
"Id"
></
key
>
04.
<
property
name
=
"Director"
></
property
>
05.
<
list
name
=
"ActorRoles"
>
06.
<
key
column
=
"MovieId"
></
key
>
07.
<
list-index
column
=
"ActorRoleIndex"
></
list-index
>
<!-- Sorting을 위한 index -->
08.
<
one-to-many
class
=
"ActorRole"
>
09.
</
one-to-many
></
list
>
10.
</
joined-subclass
>
11.
<
class
name
=
"ActorRole"
>
12.
<
id
name
=
"Id"
>
13.
<
generator
class
=
"guid.comb"
></
generator
>
14.
</
id
>
15.
<
property
name
=
"Actor"
not-null
=
"true"
></
property
>
16.
<
property
name
=
"Role"
not-null
=
"true"
></
property
>
17.
<
property
name
=
"ActorRoleIndex"
not-null
=
"true"
>
18.
</
property
></
class
>
19.
</
hibernate-mapping
>
4. Map
01.
<
joined-subclass
name
=
"Movie"
extends
=
"Product"
>
02.
<
key
column
=
"Id"
></
key
>
03.
<
property
name
=
"Director"
></
property
>
04.
<
map
name
=
"Actors"
>
05.
<
key
column
=
"MovieId"
></
key
>
06.
<
map-key
column
=
"Role"
type
=
"string"
></
map-key
>
<!-- Role 값을 Map의 key로 이용 -->
07.
<
many-to-many
class
=
"Actor"
>
08.
</
many-to-many
></
map
>
09.
</
joined-subclass
>
10.
<
class
name
=
"ActorRole"
>
11.
<
id
name
=
"Id"
>
12.
<
generator
class
=
"guid.comb"
></
generator
>
13.
</
id
>
14.
<
property
name
=
"Actor"
not-null
=
"true"
></
property
>
15.
<
property
name
=
"Role"
not-null
=
"true"
></
property
>
16.
</
class
>