Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拯救有孩子的父母?_Java_Hibernate_Parent Child_One To Many_Cascade - Fatal编程技术网

Java 如何拯救有孩子的父母?

Java 如何拯救有孩子的父母?,java,hibernate,parent-child,one-to-many,cascade,Java,Hibernate,Parent Child,One To Many,Cascade,我有父实体Order和子实体OrderItem。我想将对象Order与Set一起保存,但idOrder是自动递增的。订单和订单项之间是一对多关系订单项包括对父项的引用订单。因此,必须先保存Order项目,然后才能使用分配的idOrder保存OrderItem 这里是Order.hbm.xml <class name="hibernate.Order" table="order" catalog="my"> <id name="idOrder" type="java.la

我有父实体
Order
和子实体
OrderItem
。我想将对象
Order
Set
一起保存,但
idOrder
是自动递增的。
订单
订单项
之间是一对多关系<代码>订单项包括对父项的引用
订单
。因此,必须先保存
Order
项目,然后才能使用分配的
idOrder
保存
OrderItem

这里是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>
<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>
当我试图保存它时,它会抛出异常

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);
Order-Order=mapper.map(dtoOrder,Order.class);
Set orderItems=order.getOrderItems();
对于(OrderItem OrderItem:orderItems){
orderItem.setOrder(订单);
}
order.setOrderItems(orderItems);
会话。保存(命令);

因此这里基本上有3种解决方法

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

2.have a cascade=save update in OrderItem.hbm.xml,保存OrderItem会自动保存订单;但这并不是推荐的

3.出于某种原因,如果您坚持保存OrderItem并且不想更改hibernate确认,恐怕您必须先显式保存Order,然后调用session.flush()以在保存OrderItem之前获得Order实例的持久性


我希望这是有意义的。

你能附上有保存逻辑的代码吗。也许是刀课?从异常情况来看,您似乎试图在Order实例持久化之前持久化OrderItem。是的,因为您的级联实际上是**Order.hbm.xml**,保存订单也会使相关OrderItem实例持久化,但不是相反。因此,这里基本上有3种解决方法。1.保存Order而不是OrderItem,因为对于您当前的hibernate配置,级联从Order导航到OrderItem;2.have a cascade=save update in OrderItem.hbm.xml,保存OrderItem会自动保存订单;但这并不是推荐的;3.出于某种原因,如果您坚持保存OrderItem并且不想更改您的hibernate确认,恐怕您必须先显式保存Order,然后调用session.flush()以在保存OrderItem之前获得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);