2014-08-28 93 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