0

我有父实体Order和子实体OrderItem。我想将对象Order与 一起保存Set<OrderItem>,但是idOrder是自动递增的。Order和之间OrderItem一对多的关系。OrderItem包括对 parent 的引用Order。所以Order项目必须先保存,然后必须OrderItem用assigned保存idOrder

这是Order.hbm.xml

<class name="hibernate.Order" table="order" catalog="my">
    <id name="idOrder" type="java.lang.Integer">
        <column name="id_order" />
        <generator class="identity" />
    </id>
    <set name="orderItems" inverse="true" cascade="all">
        <key>
            <column name="id_order" not-null="true" />
        </key>
        <one-to-many class="hibernate.OrderItem" />
    </set>
</class>

班级秩序

public class Order  implements java.io.Serializable {

     private Integer idOrder;
     private Set<OrderItem> orderItems = new HashSet<OrderItem>(0);

}

这是OrderItem.hbm.xml

<class name="hibernate.OrderItem" table="order_item" catalog="my">
    <id name="idOrderItem" type="java.lang.Integer">
        <column name="id_order_item" />
        <generator class="identity" />
    </id>
    <many-to-one name="order" class="hibernate.Order" fetch="select">
        <column name="id_order" not-null="true" />
    </many-to-one>
</class>

OrderItem

public class OrderItem  implements java.io.Serializable {

     private Integer idOrderItem;
     private Order order;

}

当我尝试保存它时,它会抛出异常。

object references an unsaved transient instance - save the transient instance before flushing: hibernate.Order

编辑: 它适用于以下语句。它是否正确?

Order order = mapper.map(dtoOrder, Order.class);

Set<OrderItem> orderItems = order.getOrderItems();
for (OrderItem orderItem : orderItems) {
    orderItem.setOrder(order);
}
order.setOrderItems(orderItems);

session.save(order);
4

1 回答 1

1

所以基本上这里有3种解决方法。

1.保存订单而不是订单项,因为对于您当前的休眠配置,级联从订单导航到订单项;

2.在OrderItem.hbm.xml中有一个cascade=save-update,然后保存一个OrderItem会自动保存Order;但这不推荐;

3.由于某种原因,如果您坚持保存 OrderItem 并且不想更改您的休眠配置,恐怕您必须先显式保存 Order 然后调用 session.flush() 以在保存 OrderItem 之前持久化 Order 实例;

我希望这是有道理的。

于 2013-02-16T02:59:18.473 回答