2009-06-22 8 views
0

가 현재 나는 다음과 같은 협회와 데이터베이스가 같은 개체를 만들려고 : 많은 개입에NHibernate에 두 번

  • 하나의 클라이언트
  • 한 CaseManagement 많은 CaseManagements에
  • 하나 흡입 많은 섭취로를
  • Client, Intake, CaseManagement는 테이블 당 단일 클래스입니다.
  • 개입은 테이블 당 클래스 계층 구조입니다. 나는 이런 식으로 뭔가를 할 경우

현재 :

var client = new Client(); 
clientRepo.Add(client); 

var intake = new Intake(); 
client.Add(intake); 

var caseMan = new CaseManagement(); 
intake.Add(caseMan); 

clientRepo.Update(client); 

모든 것이 잘 작동하고, NHibernate에 (모든 적절히 연결) 데이터베이스에 다음 클라이언트, 다음 섭취와 CaseManagement을 만듭니다. 다음 작업을 수행하는 경우

그러나 :

var client = new Client(); 
clientRepo.Add(client); 

var intake = new Intake(); 
client.Add(intake); 

var caseMan = new CaseManagement(); 
intake.Add(caseMan); 

var intervention = new SubIntervention(); 
caseMan.Add(intervention); 

clientRepo.Update(client); 

그것은 망쳐 다음과 같은 SQL 실행 : 별표 라인이 동일

INSERT INTO TblClient ... (*) 
INSERT INTO TblIntake ... 
INSERT INTO TblCaseManagement ... 
INSERT INTO TblClient ... (*) 

합니다. 상속을 사용하는 이유가 무엇인지 모릅니다.

내 Intake 클래스에 대한 매핑은 다음과 같습니다 (Client 및 CaseManagement와 거의 같습니다).

가하려고하고있다 내가 그 말이냐
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="WebTracker4" 
       namespace="WebTracker4.Domain.Interventions"> 

<!-- Class Mapping --> 
<class name="Intervention" table="TblIntervention" abstract="true"> 

<!-- Id --> 
<id name="Id" column="InterventionId"> 
    <generator class="sequence"> 
    <param name="sequence">InterventionSequence</param> 
    </generator> 
</id> 

<!-- Discriminator --> 
<!-- This is used so that we can have Intervention subclasses. --> 
<discriminator column="InterventionType" type="String" /> 

<!-- TCN --> 
<version name="Tcn" column="InterventionTcn" type="Int64" /> 

<!-- Case Management --> 
<many-to-one name="CaseManagement" column="CaseManageId" class="WebTracker4.Domain.CaseManagement, WebTracker4" /> 

<!-- Properties -->  
.... 

<!-- Assessment Subclass --> 
<subclass name="SubIntervention" discriminator-value="Sub"> 
    ... 
</subclass> 

</class> 

클라이언트 개체를 다시는-추가

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="WebTracker4" 
        namespace="WebTracker4.Domain"> 

<!-- Class Mapping --> 
<class name="Intake" table="TblIntake"> 

<!-- Id --> 
<id name="Id" column="IntakeId"> 
    <generator class="sequence"> 
    <param name="sequence">IntakeSequence</param> 
    </generator> 
</id> 

<!-- TCN --> 
<version name="Tcn" column="IntakeTcn" type="Int64" /> 

<!-- Client -->  
<many-to-one name="Client" column="ClientId" class="Client" /> 

<!-- Case Management -->  
<bag name="CaseManagements" inverse="true" cascade="all" table="TblCaseManage" order-by="CaseManageId desc"> 
    <key column="IntakeId" /> 
    <one-to-many class="CaseManagement" /> 
</bag> 

<!-- Properties --> 
... 

</class> 
</hibernate-mapping> 

는 여기에 개입 클래스 계층 구조 내 매핑입니까? 주목할만한 점은 서브 클래스의 컬럼 이름을 망가 뜨리면 NHibernate는 아무 말도하지 않는다는 것입니다.

내가 문제를 파악 :)

답변

0

, 도와주세요 나를 미치게된다. 이것은 Discriminator와 속성으로 InterventionType 열을 사용했기 때문입니다. 나는

<discriminator column="InterventionType" type="String" insert="false" /> 

<discriminator column="InterventionType" type="String" /> 

를 변경 한 경우 문제가 멀리 갔다 것을 발견했다.

나는 그것이 당신이 기본적으로 Hibernate에게 discriminator 컬럼을 관리하지 말라고 말하기 때문이라고 생각한다.