0

我开始学习hibernate,我想澄清一些简单的谷歌搜索无法解决的问题。这些问题涉及 deleteOrphan、级联类型和不同关联映射类型的交互。让我开始吧。提前真诚感谢。

@Entity
@Table(name = "t_member", schema = "church")
public class Member implements Serializable {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinTable(name = "t_event_members", joinColumns = {
                    @JoinColumn(name = "member_id")
                }, inverseJoinColumns = {
                    @JoinColumn(name = "event_id")
                })
    private Set<Event> events;
}

@Entity
@Table(name = "t_event", schema = "church")
public class Event implements Serializable {
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "events", 
            cascade = CascadeType.ALL)
        private Set<Member> members;
}
  1. 成员是拥有方。在活动会话期间,我检索了一个成员。如果我从成员集合中删除一个事件并执行 saveOrUpdate 是否会从该事件中删除相应的成员?
  2. 在这种情况下,“拥有方”如何影响级联?
  3. 当我们将 orphanDelete 与 CascadeType 混合时会发生什么?
4

1 回答 1

1

1) 在这种情况下,简单地从成员中删除事件将无效,因为您没有映射孤立删除。从成员中删除事件的行为使该事件成为孤立事件,这是术语“孤立删除”的基础。并且由于您“在活动会话期间检索了该成员”,因此该成员是“受管理的”;无需调用 saveOrUpdate。托管对象的状态由 Hibernate 跟踪。

2) 大多数级联类型在关联的任一侧都有效(孤儿删除是例外)。级联表示将刚刚对一件事执行的操作级联到另一件事。拥有与否描述了 Hibernate 将使用哪一方来驱动数据库中该关联的状态。为了说明最后一点,这里有双向多对多。't_event_members' 表中的行在内存中表示两次:一次作为 Member.events 中的元素,再次作为 Event.members 中的元素。拥有本质上定义了在这两个可能不同的情况下信任哪一方。

3)孤儿删除实际上是Hibernate的级联类型。JPA 将它与级联类型(作为注释属性)分开定义,因此我们显然也支持它。

顺便说一句,孤儿删除和多对多不兼容。

于 2012-08-14T13:29:38.323 回答