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