我有父实体Order
和子实体OrderItem
。我想将对象Order
与Set<OrderItem>
一起保存,但idOrder
是自动增量。在Order
和OrderItem
之间是一对多关系。 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);
答案 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之前;
我希望这是有道理的。