
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 1:N 관계이다.
- 객체에서는 member -> team 으로 접근은 가능하지만, team -> member 로 접근이 불가능한 단방향 관계이다.
- 객체에서 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
- 위 접근처럼 참조를 사용해서 연관관계를 탐색할 수 있는데, 이를 객체 그래프 탐색 이라고 한다.
- 테이블에서는 회원의 team 컬럼을 통해 각각 join 을 통해 접근할 수 있다.
// 위 상황에서 양방향 객체로 변경
class Member() {
long id;
String name;
Team team;
}
class Team() {
long id;
String name;
List<Member> members;
}
단방향 연관관계 JPA 을 이용한 매핑
@Entity
@Datapublic
class Member() {
@Id
private long id;
private String name;
@ManayToOne
@JoinColumn(name="Team")
private Team team;
}
@Entity
@Datapublic class Team() {
@Id
private long id;
private String name;
}
@ManyToOne
- 해당 어노테이션을 통해 N:1 관계를 매핑할때 사용한다.
- 팀하나에 여러명의 회원이 속해있을 수 있다.
- 많은 사람이 -> 하나의 팀에 속해있을 수 있다.
- 해당 어노테이션이 있는 엔티티의 여러(Many) 객체가 속하는 하나(One)
- @JoinColumn 의 name 의 값에 존재하는 값과 외래키 매핑을 지정한다.
- 해당 어노테이션은 생략할 수 있으며, 생략할 경우 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 이 된다.
- JoinColumn
제목 없음
제목 없음
연관관계 사용
Team team1 = new Team(1, "팀 1");
em.persist(team1);
Member member1 = new Member(1, "Foo", team1);
Member member2 = new Member(2, "Bar", team1);
// 중요한 점은 연관관계가 있는 team 은 영속화 된 객체이어야 한다.
// 하지만, 엔티티 매핑에서 @Table 전략중 자동 식별 생성이 되는 전략이면 연관된 테이블이 영속화 된 객체가 아니면
// 해당 연관된 객체를 저장하고 영속화 한뒤, 해당 영속 객체와 매핑을 하고 저장을 한다.
em.persist(member1);
em.persist(member2);