JPA24 JPA - 다양한 연관관계 매핑(4) : 다대다 [N : M] 다대다 • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야한다. • 보면 두 개의 PK가 묶여있는걸 알 수 있다. • 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능 다대다 단방향 public class Member{ @ManyToMany @JoinTable(name = "MEMBER_PRODUCT") private List products = new ArrayList(); } 다대다 양방향 public class Member{ @ManyToMany @JoinTable(name = "MEMBER_PRODUCT") private List products = new ArrayList(); } public class.. 2022. 4. 10. JPA - 다양한 연관관계 매핑(3) : 일대일 [1 : 1] 일대일 • 회원이 딱 하나의 락커를 가지고 있는 상황이다. 반대로 락커도 회원 한명만 할당 받을 수 있는 비즈니스 적인 룰이 있고이때, 둘의 관계는 일대일 관계이다, (일대일 관계는 그 반대도 일대일) • 일대일 관계는 다대일 단방향과 매우 유사하다 (유니크가 들어가냐, 들어가지 않냐의 차이) • 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 • 주 테이블에 외래 키 (단방향, 양방향) • 대상 테이블에 외래 키 (단방향, 양방향) = 총 네 가지의 경우의 수 • 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가 • 일대일에서는 어느 테이블FK를 가지면 그 테이블과 매핑되는 객체가 연관관계의 주인이 된다. 1-1. 주 테이블 왜래 키 단방향 public class Member{ @OneToOne.. 2022. 4. 10. JPA - 다양한 연관관계 매핑(2) : 일대다 [1 : N] 1. 일대다 단방향 public class Team{ @OneToMany // (mappedBy = "team") 가 빠짐 @JoinColumn(name = "TEAM_ID") //@JoinColumn이 추가됨 private List members = new ArrayList(); // 단순 조회가 아닌 변경이 가능해짐 } public class Member{ ... // 아무것도 해줄 필요 없음 } Member member = new Member("member1"); em.persister(member); Team team = new Team("teamA"); team.getMembers().add(member); // 이런 코드가 가능해진다. em.persist(team); TEAM과 MEMBER의 .. 2022. 4. 9. JPA - 다양한 연관관계 매핑(1) : 다대일 [N : 1] feat. 연관관계 매핑시 고려사항 연관관계 매핑시 고려사항 3가지 1. 다중성 다대일 [N : 1] : @ManyToOne // 많이 사용 일대다 [1 : N] : @OneToMany // 가끔 사용 일대일 [1 : 1] : @OneToOne // 가끔 사용 다대다 [N : M] : @ManyToMany // 실무에서 사용 금지 JPA 어노테이션들은 거의 DB와 매핑하기 위해 존재한다. 따라서 다중성을 고려할때는 데이터베이스의 관점에서 다중성을 고려하면 된다. 2. 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 3. 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A.. 2022. 4. 9. JPA - 연관관계 매핑 기초(3) : 양방향 연관관계와 연관관계의 주인 (2) 1. 양방향 연관관계와 연관관계의 주인 (2) - 주의점, 정리 양방향 매핑시 가장 많이 하는 실수 연관관계의 주인에 값을 입력하지 않는다. 양방향 매핑시 연관관계의 주인에 값을 입력해야 한다. 양쪽에 값을 설정하지 않고 주인에만 값을 설정할 경우 발생하는 문제 2가지 1. 값이 정상적으로 출력되지 않는다. 연관관계의 주인에만 값을 입력하고 ex) member.setTeam(team); 바로 Team.getMembers()하고 for문을 돌려 member 값을 출력해보면 값이 출력되지 않는다. 왜냐하면 Team의 객체는 현재 DB에 insert되지 않은 영속성 컨텍스트 1차 캐시저장소에만 저장되있는 순수한 객체 상태이기 때문이다. 물론em.flush(), em.clear()를 해준 상태로 team.get.. 2022. 4. 9. 이전 1 2 3 4 5 다음