在数据库中,我有User
和Role
个实体。作为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.REMOVE
,Role
会被删除,但当然也会删除User
。
目前唯一可以实现此目的的方法是在两侧定义@JoinTable
。但这似乎更像是一种解决方法。我究竟做错了什么?由于这是一个常规用例,因此必须有解决方案,尽管我还没有找到它......
答案 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;