2014-08-28 104 views
0

分离对象我有更新脱离父/子结构的问题: (之一)为了 - >(许多)orderLines如何更新休眠

这里就是我想要做的事: *打开一个会话,加载一个订单,然后关闭会话。 *对订单的行进行一些更改。 *根据订单进行一些更改。 *打开一个新的会话,无论如何: * session.save(order)。 * session.update(order)。 * session.merge(order)。 订单的行不会被更新。

这里是我写的代码。

public class Order implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    private Integer idOrder; 
    private String date; 
    private List<OrderLine>; 

    public Order(){} 
    // getters and setters 
} 

public class OrderLine implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Integer idOrderLine; 
    private Integer quantity; 

    public OrderLine(){} 
    // getters and setters 
} 

在会话中的一个------>加载顺序

在会话中,两个

Session session = HibernateUtil.getSessionFactory().openSession(); 
Transaction tx = session.beginTransaction(); 
order.setDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date())); 

// the user has modified the quantity of each line and i want to update them. 

// which method should i use: update() or merge() or ... ?; 

tx.commit(); 

这里是我的映射:

<class name="Order" table="Order"> 
    <id name="idOrder" type="int" column="idOrder"> 
     <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"> 
      <param name="sequence_name">Order_SEQ</param> 
      <param name="initial_value">1</param> 
      <param name="increment_size">1</param> 
      <param name="value_column">CurrentValue</param> 
      <param name="optimizer">hilo</param> 
     </generator> 
    </id> 
    <property name="date"/> 
    <list name="orderLine" table="orderLine"> 
     <key column="idOrder"/> 
     <index column="idx"/> 
     <one-to-many class="OrderLine"/> 
    </list> 
</class> 

<class name="OrderLine" table="OrderLine"> 
    <id name="idOrderLine" type="int" column="idOrderLine"> 
     <generator class="increment"/> 
    </id> 
    <property name="quantity"/> 
    <many-to-one name="order" column="idOrder" not-null="true"/> 
</class> 

这是最好的如何更新订单和订单的行?

+0

不看你的对象是分离,你想呼叫的更新,你仍然在你的交易。 – Elbek 2014-08-28 02:32:18

回答

1

如果您使用session.close()关闭session,那么您必须使用session.update()而不是session.merge()。此外,由于您的映射文件中没有设置cascade属性,因此必须先保存OrderLine's,然后才能保存相应的Order

下面是示例代码,你的情况的工作:

private static void updateData(Order order) { 
    Session session = getSession(); 
    session.getTransaction().begin(); 

    // To update existing OrderLines 

    List<OrderLine> orderLines = new ArrayList<OrderLine>(); 
    for (OrderLine orderLine : order.getOrderLines()) { 
     OrderLine ol = new OrderLine(); 
     ol.setIdOrderLine(orderLine.getIdOrderLine()); 
     ol.setOrder(orderLine.getOrder()); 
     ol.setQuantity(orderLine.getQuantity() + 10); 
     orderLines.add(ol); 
    } 
    for (OrderLine orderLine : orderLines) { 
     //session.merge(orderLine); -- merge() is used when we are not closing the session using session.close() 
     session.update(orderLine); 
    } 

    // To create new OrderLine and updating existing Order 
    OrderLine ol1 = new OrderLine(); 
    ol1.setOrder(order); 
    ol1.setQuantity(80); 
    order.setStartDate(new SimpleDateFormat("yyyy-MM-dd") 
      .format(new Date())); 
    order.addOrderLine(ol1); 

    session.save(ol1); 
    //session.merge(order); 
    session.update(order); 
    session.getTransaction().commit(); 
    session.close(); 
} 
+0

谢谢,它的作品! – Martin 2014-08-28 19:19:43