2010-04-07 3 views
2

개체를 유지하기 위해 집계에 추가 된 할당 된 ID를 가진 엔티티 "Group"이 있습니다. 이것은 NHibernate가 새로운 것이거나 존재하는 것인지를 알 수 없기 때문에 문제를 일으킨다. 이 문제를 해결하기 위해 그룹 엔티티가 SQL 타임 스탬프 버전 열에서 낙관적 잠금을 사용하도록 매핑을 변경했습니다. 이로 인해 새로운 문제가 발생했습니다. 그룹에 하위 오브젝트가 있습니다. 따라서 NHibernate는 새로운 그룹을 데이터베이스로 플러시 할 때 Group 테이블에 그룹 레코드를 생성 한 다음, 각각의 하위 오브젝트를 삽입 한 다음 그룹 레코드를 업데이트하여 타임 스탬프 값을 업데이트합니다. 그러나 매핑이 dynamic-update = "true"및 optimistic-lock = "version"인 경우 업데이트를 완료하기 위해 생성 된 sql은 유효하지 않습니다.optimistic-lock = "version"및 dynamic-update = "true"가있는 NHibernate 매핑이 무효 인 update 문을 생성 중입니다.

<class xmlns="urn:nhibernate-mapping-2.2" dynamic-update="true" mutable="true" optimistic-lock="version" name="Group" table="Groups"> 
    <id name="GroupNumber" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="GroupNumber" length="5" /> 
     <generator class="assigned" /> 
    </id> 
    <version generated="always" name="Timestamp" type="BinaryBlob" unsaved-value="null"> 
     <column name="TS" not-null="false" sql-type="timestamp" /> 
    </version> 
    <property name="UID" update="false" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="GroupUID" unique="true" /> 
    </property> 
    <property name="Description" type="AnsiString"> 
     <column name="GroupDescription" length="25" not-null="true" /> 
    </property> 
    <bag access="field.camelcase-underscore" cascade="all" inverse="true" lazy="true" name="Assignments" mutable="true" order-by="GroupAssignAssignment"> 
     <key foreign-key="fk_Group_Assignments"> 
     <column name="GroupNumber" /> 
     </key> 
     <one-to-many class="Assignment" /> 
    </bag> 
    <many-to-one class="Aggregate" name="Aggregate"> 
     <column name="GroupParentID" not-null="true" /> 
    </many-to-one> 
    </class> 
</hibernate-mapping> 

맵핑이 동적 업데이트 및 optimistic 잠금을 모두 포함, 생성 된 SQL은 다음과 같습니다 : 더 SET가 없기 때문에 이것은 분명히 잘못된

UPDATE groups SET WHERE GroupNumber = 11111 AND TS=0x00000007877 

여기

은 매핑 진술. 동적 업데이트 부분을 제거하면이 업데이트 문에서 모든 내용이 업데이트됩니다. 이렇게하면 명령문은 유효하지만 오히려 불필요합니다.

전에이 문제를 본 사람이 있습니까? 내가 놓친 게 있니?

감사합니다. Steve

+0

독립 실행 형 테스트 케이스를 만들 수 있습니까? –

답변

0

id 요소에 저장되지 않은 속성을 설정해보십시오. 이것은 NHibernate가 새로운 레코드와 기존의 레코드를 구별 할 수 있도록하고 타임 스탬프 문제를 회피해야한다.

<id name="GroupNumber" unsaved-value="" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 

The documentation

는이 빈 문자열로 기본적으로해야한다고 생각하는 날 리드하지만 해볼만 한 가치는있다.

+0

생성 된 쿼리에 차이가없는 것으로 보입니다. – SteveBering

1

정확히 똑같은 문제가있어서 마침내 제대로 작동하기 전에 문서를 뒤져 봐야 할 때가있었습니다. bag 요소의 optimistic-lock 속성을 false로 설정해야합니다. 이렇게하면 NH가 업데이트 할 수있는 속성이 변경되지 않은 경우 부모가 업데이트를 표시하지 않게됩니다. 이 방법이 유용 할 것입니다.

관련 문제