如何与孩子一起保存父母?

时间:2013-02-16 01:56:13

标签: java hibernate parent-child one-to-many cascade

我有父实体Order和子实体OrderItem。我想将对象OrderSet<OrderItem>一起保存,但idOrder是自动增量。在OrderOrderItem之间是一对多关系。 OrderItem包含对父Order的引用。因此,必须首先保存Order项,然后必须保存OrderItem并指定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>

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);

1 个答案:

答案 0 :(得分:1)

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

1.Save Order而不是OrderItem,因为对于您当前的hibernate配置,级联从Order导航到OrderItem;

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

3.出于某种原因,如果你坚持保存OrderItem并且不想改变你的hibernate配置,我恐怕你必须先显式保存Order然后再调用session.flush()来获得Order实例持久化在保存OrderItem之前;

我希望这是有道理的。