- 간단히 말해 객체의 참조와 테이블의 외래 키를 매핑하는것을 말한다.
- 방향에는 단방향과 양방향이 있다.
- 객체는 참조용 필드를 가지고있는 객체만 연관된 객체를 조회 할수 있음으로 방향이 존재한다.
<회원과 팀의 관계 예시>
- 회원은 하나의 팀에만 소속된다.
- 팀은 여러 회원들이 존재한다.
- 따라서 회원과 팀은 N:1 관계이다.
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
- 객체 연관관계
- 회원과 팀 객체는 단방향 관계다. 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다.
- 테이블 연관관계 (테이블 연관관계는 항상 양방향)
- 회원 테이블은 TEAN_ID 외래 키로 팀 테이블과 연관관계를 맺는다.
- 회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있고 반대로 팀과 회원도 조인할 수 있다.
@Entity
public class Team {
......
@OneToMany(mappedBy = "Team")
private List<Member> members = new ArrayList<>();
}
- 여기선 미리 단방향으로 연관관계를 맺었기 때문에 Team 엔티티에만 추가하면 된다.
- 1:N 연관관계일 때는 @OneToMany 애노테이션을 사용한다.
- 양방향일 때 주인이 아닌 엔티티는 mappedBy 옵션에 반대쪽 매핑의 필드 이름을 넣는다.
- 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다.
객체 연관관계 = 2개
- 양방향 매핑 규칙
- 연관관계의 주인만이 외래 키를 관리 (등록, 수정)
- 주인이 아닌쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용 X
- 주인이 아닌쪽이 mappedBy 속성으로 주인 지정
- 외래 키가 있는곳을 주인으로 지정 !!