2017-02-27 72 views
1

我有三個獨立的實體,我的春天JPA應用 - 用戶,部門,角色@ManyToMany之間的關係三表

我有一個單獨的連接表在我的數據庫中涉及這些實體:USER_DEPARTMENT_ROLE

我的問題是,我如何在實體類中定義這個關係?我必須在每個獨立的實體中定義一個@ManyToMany關係嗎?我知道如何定義兩個表格之間的這種關係,但對於兩個以上的表達式我不知道從哪裏開始。

任何幫助表示讚賞!

回答

2

如果你有超過兩個關係映射到你的連接表,那麼我會建議創建一個單獨的實體,將用於映射該特定的表。

問題是你是否可以擁有一個獨特的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。但是在我看來,如果你像上面那樣映射鏈接表,你會爲自己節省很多頭痛。最後通話是你的。