JPA Hibernate多对多级联

Her*_*ery 49 many-to-many hibernate jpa cascade jpa-2.0

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

然后,我创建一个用户和组,然后将用户分配给该组.

我想要的是当我删除该组时,该组将被删除(当然),该组所拥有的所有用户组关系将自动从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;
Run Code Online (Sandbox Code Playgroud)

删除组时,用户也将被删除!

有没有办法实现我想要的?

dig*_*oel 38

它映射的方式User是关系的管理方,因此它将负责更新连接表.

JoinTable映射更改UserGroup,并使其groupList属性User具有mappedBy属性.这会将组更改为关系的管理方,并使对组的持久/更新调用管理连接表.

但请注意,您将无法简单地向用户添加组,保存用户,并继续,您将不得不将用户添加到组并保存组以查看更改,但有双向多对多希望你无论如何都会密切管理这种关系.

  • 只有一方可以成为任何双向关系的管理方.我尽可能避免双向关系,因为它们可能很难维持.您最好的选择是将其映射到符合最常规用例的一侧,然后将操作包装在一个服务方法中,该方法将确保一切都应该发生,例如更新关系的非管理方面等. (9认同)
  • 如果按照我说的方式进行,用户组关系将完全由集团方面管理.这意味着在您从所有组中删除用户之前,您可能根本无法删除该用户.为了坚持下去,您必须从组中删除用户,然后保存组.仅删除用户不会删除用户组关系,也不会删除连接表.如果没有级联,删除组将删除关联,但不删除用户,这是您在原始问题中所说的. (2认同)
  • 我明白了...所以我必须使用组作为管理方...有没有办法让双方都成为管理组?换句话说,当我删除一个用户时,用户和用户组也将被删除,但组不会被删除,当我删除一个组时,组和用户组将被删除但用户不会被删除。 (2认同)

小智 6

如前所述,如果您不需要从用户端进行级联,请设为关系的组所有者。

然后,尝试cascade=CascadeType.MERGE在删除组时使用不删除级联用户。


Pie*_*nry 5

从另一个角度看问题:

您可以向您的多对多映射表添加FK约束.实际上,出于数据完整性原因,您应始终在DB中使用FK.在这种情况下,例如,在映射表中静默留下孤立行时,至少不能删除用户.

如果有FK,则可以在约束上指定on delete cascade引用操作,DB将管理映射表的自动删除,但不会像您要求的那样管理实体的自动删除.