잊지 않겠습니다.

NHibernate mapping class의 Id는 natural-Id와 Surrogate Id로 나눌수 있는데, Natural-Id는 기본적으로 사용자가 assign 시켜줘야지 되는 Id가 되고, Surrogate Id는 Instance가 생성되어서 DB에 insert될때, DB를 통해서 채워지는 Id다. NHibernate에서는 Surrogate Id를 사용하는 것을 추천하고 있다. 그럼에도 불구하고, Natural Id를 사용해야지 되는 2가지 경우가 있는데,

1. composite keys에 의해서 Id가 결정이 나는 경우
2. natural key가 실 값이 되는 경우 : 이 경우에는 UserId 같은 특정 값을 사용할 수 있다.

이 두가지 경우를 제외하고, 나머지는 모두다 Surrogate Id를 사용해야지 된다. 다른 경우에는 확실히 코드도 지저분해지고 읽기가 힘들다. (매번 중복되지 않는 값을 확인하고 insert 시켜주는 수고를 덜 수 있다.)


 hilo  Hi/Lo Algorithm에 의하여 integer value가 자동 생성된다.

 guid  System.Guid.NewGuid() method에 의하여 새로운 Guid가 생성된다.

 guid.comb  10byte의 random-guid값이 NHibernate에 의하여 새롭게 생성된다. 이때, 값은 Date와 Time값의 조합으로 만들어진다.

 guid.native  Database에서 얻어지는 Guid값을 이용한다.

 uuid.hex  GUID 값을 32bit hex digital 값으로 dash 없어 얻어낸다.

 uuid.string  GUID깞을 string 형태로 얻어낸다. 사람이 읽을수 없는 값이다.

 counter  계속해서 증가되는 integer값으로 counter값이 생성된다.

 increment  database에서 제공되는 increment 값으로 사용한다.

 sequence  Oracle, DB2, PostreSQL에서 제공되는 sequence의 return값을 이용해서 Id값을 생성한다.

 seqhilo  hilo 알고리즘보다 좀더 좋은 속도를 가진 알고리즘으로 integer value를 자동 생성한다.

 foreign  외래 키 값을 자동으로 카피한다.

 identity  Database에서 생성되는 값을 사용한다.

 sequence-identity  Database에서 제공되는  sequence값을 이용

 trigger-identity  trigger에서 return 시켜주는 값을 이용


마지막으로 native 값을 사용하는 경우, 각 DB의 종류에 따라 각기 다른 값을 사용한다. MSSQL, DB2, MySQL의 경우에는 Integer값을 이용하고, Oracle, Firebird의 경우 sequence와 동일하다.


Posted by Y2K
,