2011-03-11 6 views
1

내 코드는 다음과 같습니다.NHibernate one-to-many 매핑 : 자식 항목 삽입 문제

Order order = new Order { ... }; 
OrderItem item = new OrderItem { ... }; 
order.Items.Add(item); 
item.Order = order; 

using(var tran = session.BeginTransaction()) { 
    session.Save(order); 
    // Without this, an exception will be thrown: Unexpected row count: 0; expected: 1 
    // session.Save(item); 

    tran.Commit(); 
} 

session.Save(item) 줄의 주석을 제거하면 해당 순서와 해당 항목이 삽입됩니다. 그렇지 않으면 "예기치 않은 행 수 : 0, 예상 : 1"예외가 발생합니다.

많은 끝 (Items 속성)을 inverse = "true"로 표시하면 아무 예외도 발생하지 않지만 Order 만 삽입합니다! 주문 항목은 DB에 삽입되지 않습니다.

session.Save(order)를 호출하지 않고 session.Save(item)을 호출하면 순서와 항목이 모두 삽입됩니다.

어떻게 session.Save(orderItem)를 호출하지 않고 session.Save(order) 만 호출하여 주문과 주문 항목을 저장할 수 있습니까? 감사!

다음은 내 매핑입니다.

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Core" assembly="Core"> 
    <class name="Order" table="[Order]"> 
    <id name="Id"> 
     <generator class="assigned" /> 
    </id> 

    <property name="Name" /> 
    <bag name="Items"> 
     <key column="CategoryId" /> 
     <one-to-many class="Core.OrderItem, Core"/> 
    </bag> 
    </class> 

    <class name="OrderItem"> 
    <id name="Id"> 
     <generator class="assigned" /> 
    </id> 
    <property name="Title" /> 
    <many-to-one name="Order" column="OrderId" cascade="save-update" not-null="true" /> 
    </class> 

</hibernate-mapping> 

답변

5

, 자동으로 당신을 위해 항목을 생성하지 않습니다

여기 내 매핑입니다.

하지만 항목을 순서대로 계단식으로 처리하므로 항목을 저장할 때 순서도 업데이트됩니다.

inverse = "true"로 지정했을 때 NHibernate에 자동으로 "Item.Order"속성을 업데이트하지 말 것과 수동으로 처리하게했다. 따라서 Order는 콜렉션에 추가 할 때 절대 연관되지 않으므로 커밋 후에 결코 나타나지 않습니다.

<bag name="Items" cascade="all"> 

과 주문에 속하는 항목을 작성, 갱신, 삭제합니다 :

내가 방금 추가 할 필요가 있다고 생각합니다.

EDIT : 물론 캐스케이드가 일대 다 노드가 아닌 가방에 있습니다.

+0

감사합니다! 나는 "캐스케이드"속성을 잘못된 위치에 추가합니다! :( –

2

주문 매핑에 폭포를 넣어보십시오 :

<bag name="Items" cascade="all"> 
    <key column="CategoryId" /> 
    <one-to-many class="Core.OrderItem, Core"/> 
</bag> 
+0

고마워! "cascade"속성을 잘못된 위치에 추가합니다! :( –