cascade =“all-delete-orphan”inverse =“true”一起工作吗?

时间:2016-03-30 06:35:52

标签: java hibernate

这是我的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-save命令保存父级和子级吗? 或者我是否需要另外一个会话保存以保存孩子?

Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(orderSet);

这些是我的数据模型:

public class OrderSet {
    private List<OrderSetMember> orderSetMembers;
}


public class OrderSetMember {
    private OrderSet orderSet;
}

1 个答案:

答案 0 :(得分:0)

cascadeinverse有两个完全不同的目的。

cascade告诉应用于父级时应该在子(ren)上自动应用哪个实体生命周期操作。

inverse表示孩子是该协会的所有者。这进一步意味着如果您不将子项与子项上的父项关联,则关系信息将不会与数据库同步。

例如,如果您向父实体实例中的OrderSetMember集合添加orderSetMembers,但在orderSet中留下null字段OrderSetMember实例,然后调用session.saveOrUpdate(orderSet),结果将是:

  1. OrderSetOrderSetMember个实例都保存到数据库中(save级联到子级)。
  2. order_set_idOrderSetMember映射到的表中的外键)设置为null。这是因为OrderSetMember是关联的所有者,并且当Hibernate在脏检查时检查关联的所有者时,没有关联的OrderSet实体。
  3. 当您在新会话中阅读上述OrderSet个实例时,您会注意到OrderSetMember集合中不存在orderSetMembers