JPA多对多关系:删除具有活动关系的子实体

时间:2017-11-30 14:16:56

标签: java hibernate jpa

在数据库中,我有UserRole个实体。作为Role实体的多对多关系的共享可以分配给多个User实体,另一方面可以将User实体分配给多个Role实体实体。

我的实体类看起来像这样

UserEntity

@Entity
public class UserEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(unique = true, nullable = false)
    private String username;
    @ManyToMany
    private Set<RoleEntity> roles;

    ...
}

RoleEntity

@Entity
public class RoleEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(unique = true, nullable = false)
    private String name;
    @ManyToMany(mappedBy = "roles")
    private Set<UserEntity> users;

    ...
}

通过这种配置,我可以相互映射实体。我也可以删除User实体。但只要存在关系,我 就无法删除Role实体。

如果我添加cascade = CascadeType.REMOVERole会被删除,但当然也会删除User

目前唯一可以实现此目的的方法是在两侧定义@JoinTable。但这似乎更像是一种解决方法。我究竟做错了什么?由于这是一个常规用例,因此必须有解决方案,尽管我还没有找到它......

1 个答案:

答案 0 :(得分:1)

你需要联接表,这不是一个解决方法。请记住,您正在将面向对象的模型映射到关系模型。在关系模型中表达多对多关系的唯一方法是定义@JoinTable。

更新:在答案中添加评论
您只需在一个实体中定义@JoinTable,例如UserEntity,而mappedBy="roles"中的RolesEntity会继承@JoinColumn@JoinTable名称的定义。

然后,您需要定义要在关系的两侧执行的级联操作。

RoleEntity

@ManyToMany(mappedBy = "roles")
private Set<UserEntity> users;

UserEntity

@ManyToMany
@JoinTable(...)
private Set<RoleEntity> roles;