2009-04-21 4 views
0

클래스 A는 그 같은 매핑 된 B의 목록을 포함하고 있습니다.NHibernate : <idbag>의 삽입/업데이트 동작을 변경하고 싶습니다.

<class name="A" table="CLASS_A"> 
    ... 
    <idbag name="ListOfB" 
      table="CLASS_A_CLASS_B" 
      cascade="save-update"> 
     <collection-id column="ID" type="Guid"> <!-- surrogate key --> 
     <generator class="guid.comb"/> 
     </collection-id> 
     <key column="ID_A"/> 
     <many-to-many column="ID_B" class="B"/> 
    </idbag> 
</class> 

DB 쪽에서는 CLASS_A & CLASS_B 테이블 사이에 many-to-many CLASS_A_CLASS_B 테이블을 조인하고 ID 대리 키를 가지고 있습니다. 다 대다 관계는 클래스 B의 객체 모델에 매핑되지 않습니다.

처음에는 ListOfB에 객체 X1과 X2가 있다고 가정 해 봅니다. X2를 제거하고 X3을 삽입하면 NHibernate가 X2를 가리키는 외래 키의 업데이트를 수행하여 X3을 가리킨다는 것을 알았습니다.

이것은 아주 좋은 최적화입니다.

그러나 내 목적을 위해, 나는 삭제를하기 위해 NHibernate에 M2M 조인 테이블 (X2에 대한 행 삭제, X3에 대한 새로운 행 삽입)에 새로운 삽입을 수행하는 트릭을하고 싶습니다. 이 테이블은 애플리케이션의 다른 인스턴스에 복제되므로 사용자에게 삽입/업데이트/삭제의 차이점을 보여주기를 바랍니다.

이 특별한 경우에는 유스 케이스가 실제로 "X2를 제거하고 X3을 추가했습니다."이므로 diff 대신 사실 (업데이트 대신)을 표시하고 싶습니다. 이 동작은 차선책이라고 이해하지만이 경우 중요하지 않습니다.

그 일을 NHibernate 트릭 방법?

+0

마크를 매핑 코드 ... 다시 동작을 트리거 할 수 없었다 및 편집기의 "코드 샘플"버튼을 클릭했습니다. 그런 다음 우리는 그것을 볼 수 있습니다 :-) –

답변

1

하나의 최적의 방법으로 X2를 제거하고 세션을 플러시 한 다음 X3을 추가합니다. 나는 nHibernate가 이것을 두 개의 분리 된 동작으로 간주하고 최적화하지 않을 것이라고 생각한다.

매핑 파일에 : <sql-delete></sql-delete> 동작을 지정할 수도 있습니다.

+0

NHibernate가 한 번의 삭제로 하나의 업데이트를 삽입 한 다음 최적화하는 것을 알지 못했습니다. 산뜻한. 세션을 플러시하는 것도 방법이라고 생각합니다. Flushing은 NHibernate가 삽입을 할 수있는 지점에서 그 지점 (삭제)까지의 모든 변경 사항을 유지하도록 지시합니다. 또한 트랜잭션 내부에서 여러 번 플러시 할 수 있습니다. –

+0

나는 어느 쪽도하지 않았다. 그리고 여전히 회의적이다. 그러나 만일 그렇다면 그것은 문제를 해결할 것이다. – JoshBerke

0

감사합니다. 플러시에 대해 생각하지 않았습니다. 그것은 확실히 잘 작동합니다.

나중에

어제, 나는

관련 문제