사용자 정의 유형에 대한 nhibernate 매핑
-
04-07-2019 - |
문제
Oracle 데이터베이스가 있고 필드 중 하나는 날짜 범위 필드입니다. 기본적으로 데이터베이스에 yyyy/mm/dd-yyyy/mm/dd 형식의 varchar (40)로 저장됩니다. 나는 nhibernate에 내가 이렇게 만든 사용자 정의 클래스에 매핑하고 싶습니다.
public class DateTimeRange
{
public DateTimeRange(DateTime fromTime, DateTime toTime)
{
FromTime = fromTime;
ToTime = toTime;
}
public override string ToString()
{
return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss"));
}
public DateTime FromTime { get; set; }
public DateTime ToTime { get; set; }
}
이와 같은 커스텀 클래스에 어떻게 매핑 할 수 있습니까?
해결책
자신의 iusertype를 구현해야합니다.
이것 좀 봐 블로그 게시물 자세한 내용은. 블로그가 사라질 경우 아래에 관련 섹션을 붙여 넣을 것입니다.
nhibernate에서 사용자 정의 매핑 유형은 iusertype 또는 icompositeUserType 인터페이스에서 파생되는 클래스입니다. 이 인터페이스에는 구현 해야하는 몇 가지 방법이 포함되어 있지만 여기서 목적을 위해 우리는 그 중 2 개에 중점을 둘 것입니다. 다음을 고려하세요.
public class TypeClassUserType : IUserType
{
object IUserType.NullSafeGet(IDataReader rs,
string[] names,
object owner) {
string name = NHibernateUtil.String.NullSafeGet(rs,
names[0]) as string;
TypeClassFactory factory = new TypeClassFactory();
TypeClass typeobj = factory.GetTypeClass(name);
return typeobj;
}
void IUserType.NullSafeSet(IDbCommand cmd,
object value,
int index) {
string name = ((TypeClass)value).Name;
NHibernateUtil.String.NullSafeSet(cmd, name, index);
}
}
이 클래스를 만들었으므로 이제 실제 클래스와 타입 클래스 간의 연관성을 실제 클래스 매핑의 간단한 속성으로 명시 적으로 매핑 할 수 있습니다.
<property
name="Type"
column="TypeName"
type="Samples.NHibernate.DataAccess.TypeClassUserType,
Samples.NHibernate.DataAccess" />
nhibernate가 실제 유형의 인스턴스를 저장하는 과정에 있으므로 typeclassuserType의 새로운 인스턴스를로드하고 생성하고 NullSafeset 메소드를 호출합니다. 메소드 본문에서 볼 수 있듯이, 매핑 된 속성에서 이름을 추출하고 (값 매개 변수로 전달됨) 추출 된 이름을 데이터베이스에서 설정할 매개 변수의 값으로 설정합니다. 순 결과는 실제 클래스의 유형 속성이 도메인 모델에서 타입 클래스이지만 typeClass 객체의 이름 속성 만 데이터베이스에 저장됩니다. 대화도 마찬가지입니다. nhibernate가 데이터베이스에서 실제 유형 인스턴스를로드하고 사용자 정의 매핑 유형의 속성을 찾으면 사용자 정의 유형을로드하고 nullSafeget 메소드를 호출합니다. 보시다시피, 내 메소드는 반환 된 데이터에서 이름을 가져오고 내 Flyweight Factory에 전화하여 OffeClass의 올바른 인스턴스를 얻은 다음 실제로 해당 인스턴스를 반환합니다. 유형 해상도 프로세스는 내 데이터 액세스 클래스 (그리고 그 문제에 대해 자체적으로 자체적으로)에 투명하게 발생합니다.