2013-03-18 36 views
0

我有两个表,order和order_items。它们之间的关系是一对多关系。 Order_items.fk_orders是外键。 Orders.ID是主键。休眠一对多出错,外键出错

我首先保存了订单,然后保存了order_items,但是order_items.fk_orders与orders.ID不同,order_items.fk_orders值很长(例如'3213148',但正常值是'425618'),这个问题有时只会发生。

Orders.hbm.xml as below: 
.... 
<id name="id" column="ID" type="java.lang.Long"> 
      <generator class="native"> 
      </generator> 
</id> 

<set name="orderProduct" lazy="false" cascade="all" 
      sort="unsorted"> 

      <key column="FK_ORDERS"></key> 

      <one-to-many 
        class="com.arvato.ecommerce.model.base.OrderItems"/> 

</set> 
.... 



OrderItem.hbm.xml as below: 
.... 
<id name="id" column="ID" type="java.lang.Long"> 
      <generator class="native"> 
      </generator> 
</id> 
<many-to-one name="orders" 
        class="com.arvato.ecommerce.model.base.Orders" cascade="none" 
        outer-join="auto" update="true" insert="true" lazy="false" 
        column="FK_ORDERS"/> 
.... 




The code as below: 
//save order 
Orders orders = new Orders(); 
.... 
.... 

orders.setOrderItems(null);//(I think it is strange I don't know why set the null value to OrderItems?) 


session = getSession(); 
session.save(object); 
session.flush() 


//save order items 
.... 
Collection orderItems = orders.getOrderItems(); 
if (orderItems != null) { 
       OrderItem orderItem; 
       for (Iterator itemIterator = orderItems.iterator(); itemIterator.hasNext(); orderdao.insertOrderProduct(orderItem)) { 
        orderItem = (OrderItem) itemIterator.next(); 
        orderItem.setOrders(orders); 

       } 
      } 

.... 



public int insertOrderProduct(OrderItem orderItem) 
      throws DaoException { 
      Session session =null; 
     try { 

      session = getSession(); 
      session.save(orderItem); 

      session.flush(); 


      return 1; 
     } catch (Exception e) { 
      e.printStackTrace(); 

      return 0; 
     } 
    } 

回答

0

你的映射似乎是正确的,这就是你使用它的方式是错误的。 由于您使用的是cascade="all",因此在保存Orders实例时,将自动保留在Orders的实例中列出的所有OrderItems

下面的代码应该足够:

Orders orders = new Orders(); 
orders.addItem(new OrderItem()); 
... 

session = getSession(); 
session.save(object); 
session.flush() 

其中AddItem方法看起来像:

public void addItem(OrderItem item) { 
    if (items == null) { 
     items = new ArrayList<OrderItem>(); 
    } 
    item.setOrders(this); 
    items.add(item); 
}