【发布时间】:2018-05-14 12:11:31
【问题描述】:
在数据库中,我有 User 和 Role 实体。共享多对多关系,因为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.REMOVE,Role 会被删除,但 User 当然也会随之删除。
目前实现此功能的唯一方法是在两侧定义@JoinTable。但这似乎更像是一种解决方法。我究竟做错了什么?由于这是一个常规用例,因此必须有解决方案,尽管我还没有找到它......
【问题讨论】:
-
您是否检查过您的映射在数据库中的外观?如果我没记错的话,如果你不添加@JoinTable,那么数据库中实际发生的是两个连接表,它们由 hibernate 以某种方式管理。这可能会给您带来一些问题。
-
我不知道这两个表。 JPA 规范确实声明应该只有一个表:JavaPersistence