1:N 관계 (One-To-Many)
설명
- 현재 Entity 객체(Team)가 One이고 연관된 객체(Member)가 Many라면
@OneToMany
선언
- One 객체(Team)에서 연관된 모든 Many 객체(Member)를 조회하는 기능이 필요한 경우 사용한다
(권장하지 않음) One 객체에서 Many 객체의 외래키 관리
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "team_id")
private List<Member> members;
}
- DB에선 항상 Many 테이블이 외래 키를 갖는다
- One 객체(Team)에서
@OneToMany
와 함께 @JoinColumn(name = "컬럼명")
을 설정하면 Many 테이블의 외래 키를 관리할 수 있다
- 테이블과 객체의 차이(방향성) 때문에 JPA에서 지원하는 다른 테이블의 외래 키를 관리하는 기능
- 단방향 One-To-Many 관계인 경우
- 양방향 관계일 때 One 객체를 연관관계의 소유측으로 설정하는 경우
- 다른 테이블에서 Many 테이블의 컬럼을 관리하는 모델은 유지보수 측면에서 헷갈릴 위험이 있으므로 좋은 방식이 아니다
@JoinColumn
은 @ManyToOne
이 선언된 Many 객체(Member)에서만 사용하는 것을 권장한다
@JoinColumn
을 사용하지 않으면 기본값으로 @JoinTable
방식을 사용하게 되는데, 이 방식은 테이블을 하나 더 추가하기 때문에 운영도 복잡해지고 성능 측면에서도 더 좋지 않다
Many 객체에서 Many 객체의 외래키 관리
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members;
}
@OneToMany(mappedBy = "Many 객체(Member)에 선언된 One 객체(Team)의 변수명")
- 연관관계의 참조측을 One 객체(Team), 소유측을 Many 객체(Member)로 지정하여 양방향 연관관계를 맺을 수 있다
mappedBy
를 사용하면 DB에 어떤 영향도 미치지 않기 때문에 언제든 사용할 수 있다