通过更新分离的父/子结构我遇到了问题: (一)订单 - > (很多)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>
这是更新订单和订单行的最佳方法吗?
答案 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();
}