如何拥有3个实体(USER,Organization和Roles)之间关系的连接表

时间:2017-09-08 19:35:39

标签: java hibernate spring-mvc jpa mapping

我有一个场景,一个员工可以属于多个组织,每个组织他可以有不同的角色。我怎样才能在jpa中映射这个?

Staff.java

public class Staff {
    @ManyToMany
    @JoinTable(name="STAFF_ORGANIZATION",joinColumns=@JoinColumn(name="staff_id"),inverseJoinColumns=@JoinColumn(name="organization_id"))
    private Set<Organization> organizations;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
}

Organization.java

public class Organization {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String OrganizationName;
    @ManyToMany(mappedBy="organizations")
    private Set<Staff> staff;
    }

StaffRoles.java

public class StaffRoles {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    @Enumerated(EnumType.ORDINAL)
    private Roles roles;

    public enum Roles {
        USER(100), ADMIN(200);
        private int values;

        Roles(int values) {
            this.values = values;
        }



        public int getValues() {
                return values;
            }
}

任何人都可以帮助我将角色映射到员工。如此多的员工可以属于许多组织,每个组织都可以拥有不同的角色。

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

虽然这个问题没有写清楚,但我会根据我的理解来回答你的问题。

下面是表格外观的ER图表。

ER Diagram

现在你只需要创建所需的类。

  1. User.java
  2. Organization.java
  3. UserOrganization.java
  4. UserRole.java
  5. 现在通过ManyToMany和OneToOne连接正确的实例变量,以实现您的目标。

    编辑:

    在使用更具体的信息更新问题之后,我可以在此答案中提供更多帮助。首先创建一个StaffOrganizationRoles类,它将位于StaffOrganization和Roles之间。接下来,使StaffOrganization位于Staff和Organization之间,这意味着不是ManyToMany,而是来自Staff的ManyToOne - &gt; StaffOrganization,以及来自组织的ManyToOne&gt; StaffOrganization。

    public class StaffOrganizationRoles {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "stafforganization_id", unique = false, nullable = false)
        private StaffOrganization user;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "role_id", unique = false, nullable = false)
        private Role role;
    
    }
    

    员工组织班:

    public class StaffOrganization {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "staff_id", unique = false, nullable = false)
        private Staff staff;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "organization_id", unique = false, nullable = false)
        private Organization organization;
    
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "staffOrganization")
        private Set<StaffOrganizationRoles> staffOrganizationRoles = new HashSet<>(0);
    
    }
    

    我编辑了上面的图片来代表新的ER图。

    希望这会对你有所帮助。