[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.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에 의해 작성됩니다.
from https://stackoverflow.com/questions/50451894/2-foreign-keys-into-a-new-table-from-different-entities-hibernate by cc-by-sa and MIT license