gpt4 book ai didi

java - JPA 多对多关系 : delete child entity not possible with active relation

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:35 28 4
gpt4 key购买 nike

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

我的实体类是这样的

用户实体

@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;

...
}

角色实体

@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。但这似乎更像是一种解决方法。我究竟做错了什么?由于这是一个常规用例,因此必须有解决方案,尽管我还没有找到...

最佳答案

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

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

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

RoleEntity

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

UserEntity

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

关于java - JPA 多对多关系 : delete child entity not possible with active relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47575585/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com