복붙노트

[SPRING] 다른 엔티티의 새로운 테이블에 2 개의 외래 키 최대 절전 모드

SPRING

다른 엔티티의 새로운 테이블에 2 개의 외래 키 최대 절전 모드

내 projecet 사람들은 역할 기반 액세스 권한이 있습니다. 한 사람이 하나 이상의 부서에서 일할 수 있습니다.

내 역할 표

Role_id Role
1       Manager
2       Employee

내 부서 표

Departmant_id Departmant
1             Production
2             Research
3             Marketing

내 사용자 표

User_id User_name
1       Jennifer
2       Kate
3       David

내가 원하는 것은 어떤 사람들이 어떤 부서에 있으며 그 부서에서 어떤 역할을하고 있는지를 명시하는 새로운 테이블입니다.

User_id Departmant_id Role_id
x       x             x

내가 뭘 하려니?

Class User{
     @ManyToOne(cascade = CascadeType.ALL)
     @JoinTable(name = "user_department_role",joinColumns = {@JoinColumn(name = "department_id",referencedColumnName = "department_id"),@JoinColumn(name = "user_id",referencedColumnName = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "role_id")})
     private Set<Department> departmentList;
}

해결법

  1. ==============================

    1.JPA에서 종종 생성되는 연관 테이블이 필요합니다. 여러 가지 이유는 주로 테이블에있는 항목을 제어하거나이 경우 n 방향 M : N 관계를 매핑하는 것입니다.

    JPA에서 종종 생성되는 연관 테이블이 필요합니다. 여러 가지 이유는 주로 테이블에있는 항목을 제어하거나이 경우 n 방향 M : N 관계를 매핑하는 것입니다.

    모든 엔티티 만들기 :

    @Entity
    public class User {
        @Id @GeneratedValue(strategy=GenerationType.AUTO) 
        private Integer id;
        private String userName;
        @OneToMany(mappedBy="user")
        private Set<UserDepartmentRoleAssociation> associations;
    ... etc
    }
    

    @Entity
    public class Department {
        @Id @GeneratedValue(strategy=GenerationType.AUTO) 
        private Integer id;
        private String department;
        @OneToMany(mappedBy="department")
        private Set<UserDepartmentRoleAssociation> associations;
        ... etc
    }
    

    @Entity
    public class Role {
        @Id @GeneratedValue(strategy=GenerationType.AUTO) 
        private Integer id;
        private String role;
        ... etc
    }
    

    연관 테이블과 id 클래스를 생성합니다.

    @Entity
    public class UserDepartmentRoleAssociation {
        @EmbeddedId private UserDepartmentRoleAssociationId id;
        @ManyToOne @MapsId("userId")
        private User user;
        @ManyToOne @MapsId("departmentId")
        private Department department;
        @ManyToOne @MapsId("roleId")
        private Role role;
        public UserDepartmentRoleAssociation() {
            id = new UserDepartmentRoleAssociationId();
        }
        ... etc
    }
    

    @Embeddable
    public class UserDepartmentRoleAssociationId implements Serializable {
        private Integer userId;
        private Integer departmentId;
        private Integer roleId;
        ... etc
    }
    

    그때 관계를 유지하고 ...

            User user = new User();
            user.setUserName("user1");
    
            Department department = new Department();
            department.setDepartment("department 1");
    
            Role role = new Role();
            role.setRole("Manager");
    
            UserDepartmentRoleAssociation association = new UserDepartmentRoleAssociation();
            association.setUser(user);
            association.setDepartment(department);
            association.setRole(role);
    
            em.persist(user);
            em.persist(department);
            em.persist(role);
            em.persist(association);
    

    조인 가져 오기와 함께 그것을 읽으려면

    User user = em.createQuery("select u from User u left join fetch u.associations ass left join fetch ass.department left join fetch ass.role where u.id = :id", User.class).setParameter("id", 1).getSingleResult();
    

    부서 및 사용자의 목록 대신 Set을 사용했기 때문에이 경우 문제가 훨씬 적습니다. 또한 UserDepartmentRoleAssociation이 소유하는 엔터티이므로 지속성을 유지하므로 관계를 유지할 때 연결을 만들 필요가 없습니다. 연관 세트는 레코드를 읽을 때 JPA에 의해 작성됩니다.

  2. from https://stackoverflow.com/questions/50451894/2-foreign-keys-into-a-new-table-from-different-entities-hibernate by cc-by-sa and MIT license