테이블
객체
테이블은 외래키 하나로 두 테이블이 연관관계를 맺음
객체 양방향 관계는 참조가 2군데 있다.
둘 중 테이블 외래키를 관리할 곳이 필요하다.
연관관계 주인 : 외래키를 관리하는 참조이다.
주인 반대 편 : 외래키에 영향을 주지 않고, 단순 조회만 가능하다.
외래키가 있는 쪽이 연관관계 주인이다.
양쪽을 서로 참조하도록 개발할 때 필요하다.
JPA 에서 가장 자주 사용하는 다중성
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<>();
@OneToMany(mappedBy="team")
얘는 team이라는 값에 의해 매핑되었다 라는 뜻으로 읽기만 가능
일대다 단방향은 '일' 이 연관관계의 주인이다.
하지만 테이블 관계는 항상 '다'에 외래 키가 있음
객체와 테이블 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조
@JoinColumn
을 사용해야한다. (안쓰면 조인 테이블 방식으로 테이블을 하나 추가된다. )
@OneToMany
@JoinColumn(name="TEAM_ID")
private List<Member> members = new ArrayList<>();
일대다 단방향 단점
- 엔티티가 관리하는 외래키가 다른 테이블에 있음
연관관계 관리를 위해 추가로 update sql 을 실행한다.
=> 다대일 양방향 매핑을 사용하도록 하자.
@JoinColumn(insertable=false,updatable=false)
주 테이블이나 대상 테이블 중 아무거나 외래키 선택 가능
외래 키에 데이터베이스 유니크 제약조건 추가해주면 좋다.
반대편은 mappedBy를 사용해주면 된다.
원리는 '다대일'과 같다
ex ) Member - Locker
member
@OneToOne
@JoinColumn(name="LOCKER_ID")
private Locker locker;
locker
@OneToOne(mappedBy = "locker")
private Member member;
실무에서 절대 쓰면 안된다
조회는 가능한데 설정하기는 어렵다
중간 테이블을 하나 만들어서 1:N 1:M 형태로 만들어서 엔티티로 등록하고 사용한다.
MemberProduct
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name="MEMBER_ID")
private Member member
@ManyToOne
@JoinColumn(name="PRODUCT_ID")
private Product product