DB 연관관계 매핑 시 고려사항
게시판(1) ← 게시글(N)(외래키 관리)
@Entity
public class Post {
@Id @GeneratedValue
@Column(name = "POST_ID")
private Long id;
@Column(name = "TITLE")
private String title;
@ManyToOne
@JoinColumn(name = "BOARD_ID") // 외래키 관리
private Board board;
}
Post
엔티티가 외래키(BOARD_ID
)를 관리하며, 이를 통해 관계 설정과 데이터베이스 반영이 이루어진다.Board
에서는 Post
리스트에 직접 접근이 불가능하다.게시판(1) ↔ 게시글(N)(관계주인)
@Entity
public class Post {
@Id @GeneratedValue
@Column(name = "POST_ID")
private Long id;
@Column(name = "TITLE")
private String title;
@ManyToOne
@JoinColumn(name = "BOARD_ID") // 외래키 관리
private Board board;
}
@Entity
public class Board {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "board") // Post가 관계의 주인임을 나타냄
List<Post> posts = new ArrayList<>(); // 리스트 형태
}
관계의 주인이 되는 것은 해당 관계에서 외래키의 관리 및 데이터베이스 반영 방식을 결정한다.
상품(1) <- 상품정보(1)
@Entity
public class ProductDetail {
@Id @GeneratedValue
@Column(name = "PRODUCT_DETAIL_ID")
private Long id;
@Column(name = "TEXT")
private String text;
@OnetoOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
상품(1) ↔ 상품정보(1)(관계주인)
@Entity
public class ProductDetail {
@Id @GeneratedValue
@Column(name = "PRODUCT_DETAIL_ID")
private Long id;
@Column(name = "TEXT")
private String text;
@OneToOne
@JoinColumn(name = "PRODUCT_ID") // 외래키 관리
private Product product;
}
@Entity
public class Product {
@Id @GeneratedValue
@Column(name = "PRODUCT_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "product") // ProductDetail 이 관계의 주인임을 나타냄
private ProductDetail productDetail; // 리스트
}
다대다 관계를 갖게 되면 다음과 같은 위험한 상황이 발생할 수 있어, 잘 사용을 하지 않는다.
대안으로 연관 테이블(중간 엔티티)을 추가하여 다대다(N:M) 관계를 두 개의 일대다(1:N) 및 다대일(N:1) 관계로 분해하여 관리하는 방법이 있다.