这是我的OrderSet.hbm
文件。它具有OrderSetMember
s作为它的子(一对多)关系。
<list name="orderSetMembers" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="order_set_id" not-null="true"/>
<list-index column="sequence_number"/>
<one-to-many class="OrderSetMember" />
</list>
这是我的OrderSetMember.hbm
文件。OrderSetMember
与其父代具有多对一关系。我想要一个双向映射。
<many-to-one name="orderSet" class="OrderSet">
<column name="order_set_id"/>
</many-to-one>
可以用一个会话保存命令同时保存父级和子级吗?或者我需要保存另一个会话来保存孩子吗?
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(orderSet);
这些是我的数据模型:
public class OrderSet {
private List<OrderSetMember> orderSetMembers;
}
public class OrderSetMember {
private OrderSet orderSet;
}
cascade
和inverse
有两个完全不同的用途。
cascade
告诉哪个实体生命周期操作在应用于父实体时应自动应用于子实体。
inverse
表示child是关联的所有者。这进一步意味着,如果不将子级与子级的父级相关联,则关系信息将不会与数据库同步。
例如,如果将OrderSetMember
添加到父实体实例中的orderSetMembers
集合,但在OrderSetMember
实例中保留orderSet
字段null
,然后调用session.saveOrUpdate(orderSet)
,结果将是:
OrderSet
和OrderSetMember
实例都保存到数据库中(save
级联到子级)order_set_id
(OrderSetMember
映射到的表中的外键)被设置为null
。这是因为OrderSetMember
是关联的所有者,当Hibernate在脏检查时检查关联的所有者时,没有关联的OrderSet
实体- 当您在新会话中读取上述
OrderSet
实例时,您会注意到orderSetMembers
集合中也不存在OrderSetMember