2013-02-16 103 views
0

我有父實體Order與子實體OrderItem。我想將對象OrderSet<OrderItem>一起保存,但idOrder是自動增量。在OrderOrderItem之間是一對多的關係。 OrderItem包括對父母Order的引用。因此Order項目必須先保存,然後必須保存OrderItem並指定idOrder如何向孩子保存父母?

這裏是Order.hbm.xml

<class name="hibernate.Order" table="order" catalog="my"> 
    <id name="idOrder" type="java.lang.Integer"> 
     <column name="id_order" /> 
     <generator class="identity" /> 
    </id> 
    <set name="orderItems" inverse="true" cascade="all"> 
     <key> 
      <column name="id_order" not-null="true" /> 
     </key> 
     <one-to-many class="hibernate.OrderItem" /> 
    </set> 
</class> 

訂購

public class Order implements java.io.Serializable { 

    private Integer idOrder; 
    private Set<OrderItem> orderItems = new HashSet<OrderItem>(0); 

} 

這裏是OrderItem.hbm.xml

<class name="hibernate.OrderItem" table="order_item" catalog="my"> 
    <id name="idOrderItem" type="java.lang.Integer"> 
     <column name="id_order_item" /> 
     <generator class="identity" /> 
    </id> 
    <many-to-one name="order" class="hibernate.Order" fetch="select"> 
     <column name="id_order" not-null="true" /> 
    </many-to-one> 
</class> 

OrderItem的

public class OrderItem implements java.io.Serializable { 

    private Integer idOrderItem; 
    private Order order; 

} 

當我試圖挽救它,它扔我的異常。

object references an unsaved transient instance - save the transient instance before flushing: hibernate.Order 

編輯: 它與下面的語句。它是否正確?

Order order = mapper.map(dtoOrder, Order.class); 

Set<OrderItem> orderItems = order.getOrderItems(); 
for (OrderItem orderItem : orderItems) { 
    orderItem.setOrder(order); 
} 
order.setOrderItems(orderItems); 

session.save(order); 
+0

你可以附帶保存邏輯的代碼嗎?也許一個DAO類? 從異常看來,您似乎試圖在Order實例持久化之前堅持OrderItem。 – spiritwalker 2013-02-16 02:15:13

+0

我編輯了我的問題。 – misco 2013-02-16 02:24:39

+0

是的,因爲您的級聯實際上在** Order.hbm.xml **中,所以保存一個Order將使相關的OrderItem實例保持持久性,但不會相反。 – spiritwalker 2013-02-16 02:26:21

回答

1

所以基本上這裏有3個解決方法。

1.Save Order而不是OrderItem,因爲關於您當前的hibernate配置,級聯導航從Order到OrderItem;

2.在OrderItem.hbm.xml中有一個cascade = save-update,然後保存一個OrderItem會自動保存Order;但這不是建議;由於某些原因,如果你堅持要保存OrderItem並且不想改變你的休眠配置,恐怕你必須首先明確地保存Order,然後調用session.flush()來獲得Order實例在保存OrderItem之前持久;

我希望這是有道理的。