2011-05-11 5 views
0

유창한 nhibernate에서 클래스 맵과 작동하는 자동 매핑을 대체하는 방법을 알아 내려고하고 있습니다. 다음은 현재 시나리오입니다.클래스 당 테이블 엔티티를 자식 클래스로 가지는 클래스에 유창한 nh 클래스 맵을 만들려면 어떻게해야합니까?

엔티티 "FooSubclassA"및 "FooSubclassB"가 하위 클래스 인 엔티티 "Foo"가 있습니다. 그들은 동일한 ID를 사용하기 때문에 discriminator 열과 SubclassMap이 없습니다. 그건 잘 작동합니다; FooSubclassA 및 FooSubclassB의 목록을 검색하고 "Foo"로 상속 된 속성을 볼 수 있습니다.

내 문제는 이제 "Foo"의 일대일 속성이있는 "Bar"클래스가 있습니다. 그 Foo 인스턴스가 실제로 Foo_id를 찾는 위치에 따라 FooSubclassA 또는 FooSubclassB가되기를 원합니다. 내 문제는 클래스 맵을 통해 이것을 정의하는 방법을 찾지 못하는 것입니다.

"Bar"엔티티에 구분자로 사용할 수있는 필드가 있습니다. 그렇게해야하는 경우입니다. (Bar.IsFooSubclassA)

답변

1

SubclassMappings에서 KeyColumn("some_column_name");으로 전화 하시겠습니까? 이것은 서브 클래스 당 테이블 매핑을 얻는 데 필요합니다. 그러면 "Bar"에서 "Foo"로의 참조는 many-to-one을위한 단순한 References()이거나 one-to-one을위한 HasOne()입니다.

다음은 귀하의 질문에 적용되지 않을 수도 있습니다하지만 난 완성도를 쓸 것이다 : 당신의 매핑이 올바른지

경우에 당신은 아마 다시 올바른 개체를 얻을 수 있지만, 단지 그것을 볼 수 없습니다. 당신은 다형적인 many-to-one 또는 one-to-one이 게이츠 클래스 ("Foo")의 프록시가 될 것임을 알아야한다. 왜냐하면 Hibernate는 프록시가있을 때 어떤 서브 클래스가 존재하는지 알 수 없기 때문이다. 만들어진. 이러한 이유로 "is"연산자 (또는 이와 유사한 연산자)로 유형을 확인할 수 없습니다.

"지연 막대"를로드 할 때 지연 연결을 사용하지 않거나 열심히 연결을 가져 오는 경우 "정상적인" "FooSubclassA"또는 "FooSubclassB"객체를 가져와야합니다.

당신이 게으른 로딩을해야하는 경우가 여기에 해결 방법을 얻을 수 있습니다 : 이것에 대한 http://sessionfactory.blogspot.com/2010/08/hacking-lazy-loaded-inheritance.html

+0

감사합니다 아주 많이; 게으른 로딩은 조금 해킹 된 것처럼 보입니다 (제목에서 알 수 있듯이). 필자의 키 칼럼은 사실 정확했지만 왜 내가 원하는 것을 할 수 없는지에 대한 설명은 의미가있다 - 나는 is/as를 사용하여 강력한 형식의 객체를 얻길 바랐다. 내 가장 큰 질문은 automapper가 ClassMap/SubclassMap을 통해 동일한 작업을 수행 할 수있는 방법을 찾을 수 없을 때 어떻게 자동으로 수행 할 수 있는지입니다. – JNadal

관련 문제