我用的是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
}
字符串
然后,我创建一个用户和组,然后将该用户分配给该组。
我想要的是,当我删除组时,组将被删除(当然),并且组所具有的所有用户-组关系将从USER_GROUP连接表中自动删除,但用户本身不会从USER表中删除。
使用上面的代码,当我删除一个组时,只有GROUP表中的行会被删除,用户在USER_GROUP连接表中仍然有一个被删除组的条目。
如果我把cascade放在User类中,像这样:
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "USER_GROUP",
joinColumns =
{
@JoinColumn(name = "GROUP_ID")
},
inverseJoinColumns =
{
@JoinColumn(name = "USER_ID")
})
private Set<Group> groupList;
型
当我删除组时,用户也会被删除!
有什么办法可以达到我的目的吗?
4条答案
按热度按时间n9vozmp41#
按照Map的方式,
User
是关系的管理端,因此它将负责更新连接表。将
JoinTable
Map从User
更改为Group
,并使User
的groupList
属性具有mappedBy
属性。这将把组更改为关系的管理方,并对组管理连接表进行持久化/更新调用。但请注意,您将无法简单地向用户添加一个组,保存用户并继续,而是必须向组添加用户并保存组以查看更改,但具有双向多对多,希望您无论如何都能密切管理这种关系。
7ivaypg92#
如前所述,如果您不需要从用户端级联,请使组成为关系的所有者。
然后,尝试使用
cascade=CascadeType.MERGE
在删除组时不删除级联用户。ef1yzkbh3#
从另一个Angular 看问题:
您可以将FK约束添加到多对多Map表中。实际上,出于数据完整性的原因,您应该始终在数据库中保留FK。例如,在这种情况下,至少不能删除用户,同时在Map表中保留孤立行。
当您有FK时,您可以在约束上指定on delete cascade referential操作,DB将管理Map表的自动删除,但不管理实体的自动删除,就像您要求的那样。
zf9nrax14#
你可以做这样的事
字符串