// @ID가 붙은 identifier 필드는 @Entity가 붙은 클래스에 필수로 존재해야 하나,
// 편의상 생략함
// ex1) Post : Board = N : 1
public class Post {
@ManyToOne
@JoinColumn(name = "BOARD_ID")
private Board board;
}
public class Board {
}
// ex2) Order : Member = N : 1
public class Order {
@ManyToOne
@JoinColumn(name="MEMBER_ID")
private Member member;
}
public class Member {
}
DB에서 외래키는 N 테이블에 저장함
-> Post 테이블에 BOARD_ID 열을 외래 키로 가짐
-> @JoinColumn(name="BOARD_ID")
mappedBy
- 연관 관계 주인
- @OneToMany가 단방향이 아닐 때(양방향일 때)만 필요함
연관 관계 주인
- 두 객체 중 외래 키 역할하는 필드명
- N 클래스 필드 중 1 클래스 객체 필드명
- ex) Post 테이블에서 BOARD_ID를 외래키로 가지는데,
이 때 Post 클래스에서는 private Board board 필드를 가짐.
-> 연관 관계 주인 = board
// ex1) Post : Board = N : 1
public class Post {
@ManyToOne
@JoinColumn(name = "BOARD_ID")
private Board board;
}
public class Board {
@OneToMany(mappedBy="board")
private List<Post> posts = new ArrayList<>();
}
// ex2) Order : Member = N : 1
public class Order {
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
public class Member {
@OneToMany(mappedBy="member")
List<Order> orders = new ArrayList<>();
// ex1) Board : Post = 1 : N
public class Board {
@OneToMany
@JoinColumn(name = "POST_ID")
private List<Post> posts = new ArrayList<>();
}
public class Post {
}
// ex2) Member : Order = 1 : N
public class Member {
@OneToMany
@JoinColumn(name = "ORDER_ID")
List<Order> orders = new ArrayList<>();
}
public class Order {
}
Post post = new Post();
entityManager.persist(post);
Board board = new Board();
board.getPosts().add(post);
entityManager.persist(board);
-> 실행 결과
// ex1)
public class Post {
@OneToOne
@JoinColumn("ATTACH_ID)
private Attach attach;
}
public class Attach {
}
// ex2)
public class Member {
@OneToOne
@JoinColumn(name = "STAMP_ID")
private Stamp stamp;
}
public class Stamp {
}
// ex1)
public class Post {
@OneToOne
@JoinColumn("ATTACH_ID)
private Attach attach;
}
public class Attach {
@OneToOne(mappedBy = "attach")
private Post post;
}
// ex2)
public class Member {
@OneToOne
@JoinColumn(name = "STAMP_ID")
private Stamp stamp;
}
public class Stamp {
@OneToOne(mappedBy = "stamp")
private Member member;
}
JPA에서 지원 X
ex1)
public class Post {
@OneToOne(mappedBy = "post")
private Attach attach;
}
public class Attach {
@OneToOne
@JoinColumn("POST_ID")
private Post post;
}
ex2)
public class Member {
@OneToOne(mappedBy = "member")
private Attach attach;
}
public class Attach {
@OneToOne
@JoinColumn("MEMBER_ID")
private Member member;
}
1:1 주 테이블에 외래키, 양방향과 서로 바꿔주기만 하면 된다.
참고