@ManyToMany三个表之间的关系

时间:2017-02-27 14:43:06

标签: java spring jpa orm

我的Spring JPA应用程序中有三个独立的实体 - 用户,部门,角色

我的数据库中有一个连接表,用于关联每个实体:USER_DEPARTMENT_ROLE

我的问题是,如何在我的实体类中定义这种关系?我是否必须在每个单独的实体中定义@ManyToMany关系?我知道如何在两个表之间定义这种关系,但是对于两个以上的表,我不知道从哪里开始。

感谢任何帮助!

1 个答案:

答案 0 :(得分:11)

如果您在连接表中映射了两个以上的关系,那么我建议创建一个单独的实体,用于映射该特定表。

问题是你是否可以拥有一个独特的id列作为人工主键,或者你必须坚持使用三个外键的复合主键构建。

如果您可以添加该人工ID(这是设计数据库的现代方法),那么您的映射应如下所示:

选项1

org.apache.struts2.views.freemarker.FreemarkerManager

关于为多对多关系设置级联类型是棘手的,对于涉及三个表的许多对很多甚至更棘手,因为每个实体可以根据情况发挥父或子的作用..我建议只坚持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; } 并手动处理其他操作。

如果您必须使用复合主键,则应添加其他Id类并将链接实体更改为以下内容:

选项2

cascade = {CascadeType.PERSIST, CascadeType.MERGE}

关联表

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;
}

最重要的是,你可以在这里使用许多对许多,如本文所述 - &gt; example。但是在我看来,如果你按照上面的方式映射链接表,你会省去很多麻烦。最后,电话是你的..