객체 연관관계와 테이블 연관관계의 차이
객체 그래프 탐색: 객체가 참조를 통해서 연관관계를 탐색
조인: 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에서는 복합키를 사용하기 위한 규칙이 있다싹다 양방향으로 하는건 문제있다