연관관계 매핑
방향 :
- 단방향 : 두개의 관계가 있을때 한 쪽만 참조하는것
- 양방향 : 두개의 관계가 있을때 두개 서로 참조하는것
다중성 :
- 다대일(N:1)
- 일대다(1:N)
- 일대일(1:1)
- 다대다(N:M)
연관관계 주인 :
- 겍체를 양방향 연관관계로 만들면 주인을 정해주어야 한다.
@ManyToOne 단방향
다대일(N:1) 매핑할때 쓰이는 어노테이션이다.
하나의 팀에 여러명의 회원이 포함되어있다고 예를 들어보면
아래와 같이 작성할수있다.
Member Entity
@Entity
public class Member{
@Id
@Colomn(name = "member_id")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
Team Entity
@Entity
public class Team{
@Id
@Colomn(name = "team_id")
private Long id;
private String name;
}
@ManyToOne
다대일(N:1) 매핑 정보이다.
연관관계를 매핑할때에는 이렇게 다중성을 나타내는 어노테이션은 필수이다
@JoinColumn(name="team_id")
외래키를 매핑할때 사용된다.
위 엔티티로써는 Member테이블에 team_id가 fk로 설정된다.
@OneToMany 양방향
위와같이 @ManyToOne으로 팀과 회원의 연관관계를 정의하면
Member에서 Team정보를 가져올수있지만 (단방향)
Team에서 Member정보는 가져올수없다.
이럴때 Team에서 Member정보를 가져오고싶으면 @OneToMany를 이용해 양방향으로 매핑해줄수있다
Team Entity
@Entity
public class Team{
@Id
@Colomn(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
이렇게 Team은 Member를 List<>로 정의하게되고
mappedBy를 이용해 연관관계의 주인이 아니라는것을 설정해주어야한다.
여기서 연관관계의 주인이라는것은 외래키를 가지는쪽이 주인이된다
다대일(N:1) 관계에서는 항상 다(N)쪽이 연관관계의 주인이된다.
그렇기 때문에 @ManyToOne어노테이션에는 mappedBy속성이 없다
Team테이블에 member가 fk인 컬럼이 생성되지않는다.