2013-02-16 96 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之前持久;

我希望这是有道理的。