2017-02-27 105 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。但是在我看来,如果你像上面那样映射链接表,你会为自己节省很多头痛。最后通话是你的。