JPA Hibernate多对多级联

6tdlim6h  于 2023-08-06  发布在  其他
关注(0)|答案(4)|浏览(133)

我用的是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;


当我删除组时,用户也会被删除!
有什么办法可以达到我的目的吗?

n9vozmp4

n9vozmp41#

按照Map的方式,User是关系的管理端,因此它将负责更新连接表。
JoinTableMap从User更改为Group,并使UsergroupList属性具有mappedBy属性。这将把组更改为关系的管理方,并对组管理连接表进行持久化/更新调用。
但请注意,您将无法简单地向用户添加一个组,保存用户并继续,而是必须向组添加用户并保存组以查看更改,但具有双向多对多,希望您无论如何都能密切管理这种关系。

7ivaypg9

7ivaypg92#

如前所述,如果您不需要从用户端级联,请使组成为关系的所有者。
然后,尝试使用cascade=CascadeType.MERGE在删除组时不删除级联用户。

ef1yzkbh

ef1yzkbh3#

从另一个Angular 看问题:
您可以将FK约束添加到多对多Map表中。实际上,出于数据完整性的原因,您应该始终在数据库中保留FK。例如,在这种情况下,至少不能删除用户,同时在Map表中保留孤立行。
当您有FK时,您可以在约束上指定on delete cascade referential操作,DB将管理Map表的自动删除,但不管理实体的自动删除,就像您要求的那样。

zf9nrax1

zf9nrax14#

你可以做这样的事

@PreRemove
private void removeMembers() {
    this.memberList.clear();
}

字符串

相关问题