【发布时间】:2016-12-20 10:33:51
【问题描述】:
我有三张桌子,我想加入它们,这让我发疯。
标签:任务 项目 用户
它们之间都有多对多关系:比如项目有多个用户,反之亦然,任务也有多个用户,反之亦然,项目和用户也是如此。 p>
我正在尝试找到一种在 JPA 和 Hibernate 中实现它的方法,我有 2 个选择: ** 1 ** 像这样加入 3 个实体:
项目:
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = User.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "UserFk", referencedColumnName = "id", updatable=false, nullable=false))
private Set<User> users = new HashSet<>();
用户:
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = Project.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "UserFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false))
private Set<Project> projects = new HashSet<>();
任务:
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = User.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "TaskFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false))
@MapKeyJoinColumn(name = "User_id")
@ElementCollection
private Map<Project, User> projectUserMap = new HashMap<>();
但这里似乎不起作用
2:创建第 4 个实体并将其命名为 Collaborator,然后尝试找到实现此 SQL 查询的方法:
select * from (
select user.id, Project.id, Task.id
inner join Project on user.join_key = Project.join_key
inner join Task on task.join_key = = Project.join_key
) collaborator
任何帮助都会非常感激。谢谢。
【问题讨论】:
-
我只是查看了您的配置,发现了很多错误和冗余。请研究有关 JPA 集合映射的更多信息以深入了解。
-
那是因为我不明白如何加入这三个表。我最初使用项目和用户确实很容易成功,但使用三元关联有点困难。
-
我不使用 mappedBy,因为我想控制删除操作的发生方式。:这是你正在做的一个大错误。 mappedBy 和 coltrolling 删除与 eash other 没有任何关系。在双向关联中,一侧必须是相反的一侧,因此使用 mappedBy。您在 Task 中添加也没有多大意义。如果您有 3 个 ManyToMany 关联,则需要 3 个不同的连接表。
-
感谢 mappedBy 说明。但这就是我要逃避的。我不想制作三个连接表。我想我会制作 1 个连接表,其中包含 3 个表的 IDs,例如:1_Project / 1_Task / 1_USER 如上一个 SQL 查询 中所示。
-
如果表有三列,则不是两个实体之间的连接表,需要将其映射为实体。
标签: sql spring hibernate jpa spring-data