我有三張桌子,我想加入他們,這讓我瘋狂。加入3桌Hibernate和JPA
Tabels:任務 項目 用戶
他們都有一個許多一對多它們之間的關係:喜歡的項目有多個用戶,反之亦然,也任務有多個用戶反之亦然,項目和用戶也是如此。
我試圖找到一種方法來實現,在JPA & Hibernate和我有兩個選擇: ** ** 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<>();
但這裏不到風度似乎工作
:創建一個第四實體並將其命名爲合作者,然後試圖找到實現此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
任何幫助將許多 apreciated。謝謝。
我只是看看你的配置,找出很多錯誤和冗餘。請詳細瞭解JPA Collection Mapping以深入瞭解這一點。 –
這是因爲我沒有不解決以及如何加入這三個表格。我一開始就很容易成功地獲得了項目和用戶的成功,但是通過三元關聯,它有點難。 –
*我不使用mappedBy,因爲我想控制刪除操作發生的方式。*:這是一個很大的錯誤,你正在做。 mappedBy和coltrolling的刪除與eash沒有任何關係。在雙向關聯中,一方**必須**是反面,因此使用mappedBy。你在任務中挺身而出也沒有什麼意義。如果您有三個ManyToMany關聯,則需要3個不同的連接表。 –