객체 연관관계와 테이블 연관관계의 차이
객체 그래프 탐색: 객체가 참조를 통해서 연관관계를 탐색
조인: DB가 외래키를 사용해 연관관계를 탐색
@Entity
public class Member {
@Id
private String id;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
@ManyToOne : 다대일(N:1) 관계
@JoinColumn : 외래키를 매핑할 때 사용
저장
조회
수정
연관관계 제거 member1.setTeam(null);
@Entity
public class Team {
@Id
private String id;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
}
OneToMany : 일대다 (1:N) 관계
mappedBy 속성이 뭐지?
member와 team은 다대일 관계이므로
외래키의 주인은 member 다. 때문에 mappedBy는 team에 있어야 함저장
연관관계의 주인이 외래 키를 관리하기에, 주인이 아닌 방향은 값을 설정하지 않아도 외래키 값이 정상 입력된다.
하지만, 순수한 객체까지 고려한다면 양쪽 방향에 모두 값을 입력해주는 것이 가장 안전하다.
mappedBy 속성 사용
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team
}


@Entity
public class Team {
@OneToMany
@JoinColumn(name = "team_id") // member table의 team_id
private List<Member> members = new ArrayList<Member>();
}
연관관계 처리를 위한 UPDATE SQL을 추가 진행해야 함.
INSERT member1
INSERT member2
INSERT team1 -> UPDATE member1.fk UPDATE member2.fk
@OneToMany 는 연관관계 주인이 될 수 없음
@Entity
public class Member {
@OneToOne
@JoinColumn(name = "team_id")
private Team team;
}
@Entity
public class Team {
@OneToOne(mappedBy = "team")
private Member member;
}
@Entity
public class Member {
@Id @Column(name="member_id")
private String id;
@ManyToMany
@JoinTable(name = "member_product",
joinColumns = @JoinColumn(name = "member_id"),
inverseJoinColumns = @JoinColumn(name = "product_id"))
private List<Product> products = new ArrayList<Product>();
}
@Entity
public class Product {
@Id @Column(name = "product_id")
private String id;
}
@ManyToMany @JoinTable 을 이용해 연결 테이블 매핑@Entity
public class Product {
@Id @Column(name = "product_id")
private String id;
@ManyToMany(mappedBy = "products")
private List<Member> members;
}
@Entity
@IdClass(MemberProductId.class)
public class MemberProduct {
@Id
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@Id
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
}
public class MemberProductId implements Serializable {
...
} 회원_상품 엔티티는 member_id 와 product_id 로 이루어진 복합키를 지닌다. JPA에서는 복합키를 사용하기 위한 규칙이 있다싹다 양방향으로 하는건 문제있다