我有三個獨立的實體,我的春天JPA應用 - 用戶,部門,角色@ManyToMany之間的關係三表
我有一個單獨的連接表在我的數據庫中涉及這些實體:USER_DEPARTMENT_ROLE
我的問題是,我如何在實體類中定義這個關係?我必須在每個獨立的實體中定義一個@ManyToMany
關係嗎?我知道如何定義兩個表格之間的這種關係,但對於兩個以上的表達式我不知道從哪裏開始。
任何幫助表示讚賞!
我有三個獨立的實體,我的春天JPA應用 - 用戶,部門,角色@ManyToMany之間的關係三表
我有一個單獨的連接表在我的數據庫中涉及這些實體:USER_DEPARTMENT_ROLE
我的問題是,我如何在實體類中定義這個關係?我必須在每個獨立的實體中定義一個@ManyToMany
關係嗎?我知道如何定義兩個表格之間的這種關係,但對於兩個以上的表達式我不知道從哪裏開始。
任何幫助表示讚賞!
如果你有超過兩個關係映射到你的連接表,那麼我會建議創建一個單獨的實體,將用於映射該特定的表。
問題是你是否可以擁有一個獨特的id列作爲人造主鍵,或者你必須堅持使用三個外鍵的複合主鍵構建。
如果你可以添加人工ID(這是設計數據庫的現代的方式),那麼你的映射看起來應該像下面這樣:
選項1
class User {
@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Department{
@OneToMany(mappedBy = "department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Role{
@OneToMany(mappedBy = "role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class UserDepartmentRoleLink {
@Id
@GeneratedValue
private Long id;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "user_id")
private User user;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "department_id")
private Department department;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "role_id")
private Role role;
}
關於設置級聯類型的許多到許多relatioship是棘手的,對許多涉及三個表更加棘手,因爲每個實體可以扮演父母或孩子的角色取決於具體情況..我建議堅持只與cascade = {CascadeType.PERSIST, CascadeType.MERGE}
和處理其他操作馬努盟友。
如果你留在複合主鍵,那麼你應該添加額外的ID類和更改鏈接實體如下:
選項2
class User {
@OneToMany(mappedBy = "linkPk.user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Department{
@OneToMany(mappedBy = "linkPk.department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Role{
@OneToMany(mappedBy = "linkPk.role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
鏈接表
class UserDepartmentRoleLink {
@EmbeddedId
private UserDepartmentRoleLinkId linkPk
= new UserDepartmentRoleLinkId();
@Transient
public User getUser() {
return getLinkPk().getUser();
}
@Transient
public User getDepartment() {
return getLinkPk().getDepartment();
}
@Transient
public User getRole() {
return getLinkPk().getRole();
}
}
@Embeddable
public class UserDepartmentRoleLinkId implements java.io.Serializable {
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "user_id")
private User user;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "department_id")
private Department department;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "role_id")
private Role role;
底線是,你可以使用Many To許多這裏像這篇文章中概述 - >example。但是在我看來,如果你像上面那樣映射鏈接表,你會爲自己節省很多頭痛。最後通話是你的。