JPAhibernate多对多级联
我正在使用JPA 2.0和hibernate。 我有一个User类和一个Group类,如下所示:
public class User implements Serializable { @Id @Column(name="USER_ID") private String userId; @ManyToMany @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "GROUP_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") } ) private Set<Group> groupList; //get set methods } public class Group { @Id @Column(name="GROUP_ID") private String groupId; @ManyToMany(mappedBy="groupList") private Set<User> memberList; //get set methods }
然后,我创build一个用户和组,然后将用户分配给该组。
我想要的是当我删除组时,组将被删除(当然),并且该组具有的所有用户组关系将自动从USER_GROUP连接表中删除,但用户本身不会从USER表。
使用上面的代码,当删除一个组时,只有GROUP表中的行将被删除,并且用户仍然拥有USER_GROUP连接表中已删除组的条目。
如果我像这样在User类中放置级联:
@ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "GROUP_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") }) private Set<Group> groupList;
当我删除组时,用户也将被删除!
有什么办法实现我想要的?
User
是这种关系的pipe理方,因此它将负责更新连接表。
将JoinTable
映射从User
更改为Group
,并将User
的groupList
属性更改为具有mappedBy
属性。 这将把组更改为关系的pipe理方,并且使组的持续/更新调用来pipe理联接表。
但是请注意,您将无法简单地向用户添加组,保存用户并继续,而必须将用户添加到组中,然后保存该组以查看更改,但是有双向多对多的希望你会密切pipe理这种关系。
从另一个angular度看问题:
你可以添加FK约束给你多对多的映射表。 实际上,出于数据完整性原因,您应该始终在DB中拥有FK。 例如,在这种情况下,至less用户不能在映射表中静默地离开孤行。
当你有FK的时候,你可以在约束上指定删除级联参照动作 ,而数据库将pipe理映射表的自动删除,而不是你要求的实体的自动删除。
如已经表明的那样,如果你不需要从用户端级联,就可以使关系的组主人。
然后,尝试使用cascade=CascadeType.MERGE
在删除组时不删除级联用户。