Hibernate的问题

时间:2012-08-14 12:21:26

标签: hibernate jpa

我开始学习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混合使用时会发生什么?

1 个答案:

答案 0 :(得分:1)

1)在这种情况下,简单地从成员中删除事件将不起作用,因为您尚未映射孤立删除。从成员中删除事件的行为使该事件成为孤儿,这是“孤儿删除”一词的基础。而且,由于您“在活动会话期间检索了该成员”,该成员将被“管理”;无需调用saveOrUpdate。管理对象的状态由Hibernate跟踪。

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

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

BTW孤儿删除和多对多不兼容。