객체의 참조와 테이블의 외래 키의 매핑
객체의 연관관계는 참조 > .getTeam()
테이블은 연관관계는 외래키
용어 이해
방향 : 단방향, 양방향
다중성 : 다대일, 일대다, 일대일, 다대다
연관관계의 주인 : 객체 양방향 연관관계는 관리가 필요
객체지향의 오해와 진실/오브젝트 책 추천
테이블 연관관계에서 다대일(N:1) 관계일 경우
하나의 팀에서 여러명의 멤버일때
팀:멤버 = 1:N
- Member 클래스에서 Team 클래스를 쓸 때 연관관계는 @ManyToOne
- Member 객체는 MEMBER 테이블의 FK와 조인해야해서 @JoinColumn(name = "TEAM_ID")
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
가장 중요!
양방향 연관관계와 연관관계의 주인
양방향 참조할 수 있는것
보다시피 위에서 정리했던 단방향 연관관계의 테이블과 전혀 변화가 없다.
MEMBER의 FK와 TEAM의 PK와 조인만 하면 양쪽으로 연관관계를 다 알 수 있다.
문제는 객체! 멤버에서 팀은 갈수 있으나 팀에서 멤버는 못갔다
그래서 팀에 List members를 넣어준다.
mappedBy = "team"
팀과 멤버는 일대다 관계여서 @OneToMany
@Entity
public class Team {
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
mappedBy = "team" 는 멤버 클래스의 team 과 매핑이 되어있는 상태이다 라는 뜻
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
객체와 테이블이 관계를 맺는 차이
- 객체 연관관계 (2개) : 사실 양방향 관계가 아닌 서로 다른 단방향 관계 2개
- 멤버 > 팀 = 1개 (단방향)
- 팀 > 멤버 = 1개 (단방향)
- 테이블 연관관계 = 1개
- 멤버 <> 팀 = 1개 (양방향 , 사실 방향이 없음)
단방향 연관관계를 2개 만들어서 객체를 양방향으로 참조한 것!
외래키 하나로 양방향 연관관계를 가짐 (양쪽으로 조인가능)
연관관계의 주인
양방향 매핑에서 나옴
객체 두 관계 중 하나를 연관관계의 주인으로 지정해야하는데
주인만이 외래 키를 관리(등록, 수정) 하고 주인이 아니면 읽기만 가능
주인은 mappedBy 속성 사용할 수 없으며 주인이 아니면 mappedBy 속성으로 주인을 지정해야한다.
@Entity
public class Team {
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
mappedBy = "team"라는 의미는 'team에 의해 관리가 된다'는 뜻
team은 Member 클래스에 있으며
결론적으로 여기에서 값을 수정해봤자 소용이 없고 조회만 가능하다.
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
여기는 연관관계의 주인
결론
누구를 주인으로 하는가? 외래 키가 있는 곳을 주인으로 정해야한다!!
다대일 은 외래키가 있는 곳이 '다' 고 외래키가 없는곳이 '일'이다
다시 말해, '다' 쪽이 외래키가 있어서 무조건 연관관계의 주인이다.
그러면 덜 헷갈린다
'공부' 카테고리의 다른 글
Spring boot | 스프링 부트 프로젝트 생성 (1) | 2023.11.20 |
---|---|
객체 지향 프로그래밍과 다형성 (feat. 스프링) | SOLID (0) | 2023.11.06 |
엔티티 매핑 (2) | @Id 기본 키 매핑 (0) | 2023.09.22 |
엔티티 매핑 (1) | @Entity, @Table, @Column, @Enumerated.. (0) | 2023.09.22 |
JPA (3) 영속성 컨텍스트 | 생명주기(영속,비영속,준영속),이점(1차캐시,더티체킹,동일성) (0) | 2023.09.21 |