【发布时间】:2021-10-04 08:38:33
【问题描述】:
我有一个连接表,其中包含一个额外的列,用于用户和项目之间的多对多关系。它看起来像这样:
| user_id (pk) | project_id (pk) | role (pk) |
|---|---|---|
| 1 | 1 | MANAGER |
| 2 | 1 | WORKER |
| 1 | 2 | MANAGER |
| 1 | 2 | WORKER |
在此示例中,项目 1 有两个参与者,用户 1 在那里,角色为经理,用户 2 在那里,角色为工人。在项目 2 中,只有一个参与者,用户 1,其角色是经理和工人。
我想要完成的是这样的 Java 表示:
@Entity(...)
class ProjectRole {
// some annotations
private User user;
// some annotations
private Project project;
// some annotations
private Set<String> roles;
// getters and setters
}
我知道获得这样一个对象的两种间接方法。
备选方案 1:将表的实体映射为:
@Id
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@Id
@ManyToOne
@JoinColumn(name = "project_id")
Project project;
@Id
String role;
并为同一用户(每个项目)组合多个命中并将其映射到像上面想要的结构这样的对象,但这将不允许在将来使用排序或分页,并且获得目标结构会很好直接。
备选方案 2:我可以使用人工表 participant.id 创建一个人工表 participants,并在 participant_roles 表中使用它。所以我得到了两个实体,而第一个可以有一个Set<ParticipantRole>。但是我必须在数据库中保存很多不必要的信息。
也许这是不可能的,因为实体实例或多或少是数据库中一行的表示,所以我总是会为每个用户(每个项目)获得多个条目。或者有什么我到目前为止还没有看到的东西来完成它?
【问题讨论】:
标签: java sql hibernate jpa many-to-many