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

标签 java hibernate

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

相关文章:

java - 从 Java 并排生成两个 HTML 表格

java - 有没有办法使用 "GREATEST(field1, field2)"进行 SELECT,其中 field1 和 field2 是同一选择中的聚合和?

java - 执行我的 java 程序后,从 pubnub 获取正确的发布数据,但后来不正确

java - Selenium WebDriver RuntimeException :Process refused to die after 10 seconds, 并且无法对其进行 taskkill:无法找到可执行文件:taskkill

java - 如何在 selenium webdriver 中使用 CSS 选择器 `contains` 获取元素

Java 虚拟机崩溃

java - 将字段添加到表并重新生成后保留对 JPA 实体所做的自定义更改

java - org.hibernate.MappingException : Unknown entity - though my entity has all it needs

java - 带有 H2 JPA 的 Spring boot 和 JUnit 导致找不到 'pg_class'

hibernate - Tomcat 上的 Spring Security/JSF/Hibernate 意外 session 劫持?