我开始学习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;
}
答案 0 :(得分:1)
1)在这种情况下,简单地从成员中删除事件将不起作用,因为您尚未映射孤立删除。从成员中删除事件的行为使该事件成为孤儿,这是“孤儿删除”一词的基础。而且,由于您“在活动会话期间检索了该成员”,该成员将被“管理”;无需调用saveOrUpdate。管理对象的状态由Hibernate跟踪。
2)大多数级联类型在关联的任一侧都有效(孤立删除是此例外)。 Cascading表示将刚刚执行的操作级联到另一个。拥有或不描述Hibernate将使用哪一方来驱动数据库中该关联的状态。为了说明这最后一点,这里你有双向多对多。 't_event_members'表中的行在内存中表示两次:一次作为Member.events中的元素,再次作为Event.members中的元素。拥有本质上定义了在那些可能不同的情况下信任哪一方。
3)孤儿删除实际上是Hibernate的级联类型。 JPA将它与级联类型(作为注释属性)分开定义,因此我们显然也支持它。
BTW孤儿删除和多对多不兼容。