如何在hibernate中更新分离的对象

时间:2014-08-28 02:01:21

标签: java hibernate

通过更新分离的父/子结构我遇到了问题: (一)订单 - > (很多)orderLines

这是我正在尝试做的事情: *打开会话,加载订单然后关闭会话。 *在订单行进行一些更改。 *在订单上进行一些更改。 *打开一个新的会话,无论我做什么:       * session.save(订单)。       * session.update(订单)。       * session.merge(订单)。 订单的行永远不会更新。

这是我写的代码。

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  
}

在第一节中------&gt;加载订单

第二节

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>

这是更新订单和订单行的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

如果您使用session关闭session.close(),则必须使用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();
}