gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:36:29 25 4
gpt4 key购买 nike

我在更新分离的父/子结构时遇到问题:(一个)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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com