作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在更新分离的父/子结构时遇到问题:(一个)order -> (很多)orderLines
这就是我正在尝试做的事情:*打开 session ,加载订单,然后关闭 session 。*对订单行进行一些更改。*对订单进行一些更改。*打开一个新 session ,无论我是否这样做: * session .保存(订单)。 * session .更新(订单)。 * session .合并(订单)。订单行永远不会更新。
这是我编写的代码。
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 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>
更新订单和订单行的最佳方式是什么?
最佳答案
如果您要使用 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();
}
关于java - 如何在 hibernate 中更新分离的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25539577/
我是一名优秀的程序员,十分优秀!