[JPA] JPA 프로그래밍 1대N 맵핑
JPA 프로그래밍 1대N 맵핑
관계에는 항상 두가지 엔티티가 존재
- 둘 중 하나는 그 관계의 주인(owning)이고
- 다른 쪽은 종속된(non-owning)쪽입니다.
- 해당 관계의 반대쪽 레퍼런스를 가지고 있는 쪽이 주인
단방향에서 관계의 주인은 명확
- 관계를 정의한 쪽이 그 관계의 주인
단방향 @ManyToOne
- 기본값은 FK생성
public class Study {
@Id @GeneratedValue
private String Long id;
private String name;
@ManyToOne
private Account owner;
}
결과는 Study테이블에 Account의 id값이 FK로 잡힘
단방향 @OneToMany
public class Account {
@Id @GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany
private Set<Study> studies = new HashSet<>();
}
결과는 Account테이블, Study테이블, Account_studies 테이블(조인테이블) 생성
양방향
- FK 가지고 있는 쪽이 오너, 따라서 기본값은 @ManyToOne 가지고 있는 쪽이 주인
- 주인이 아닌쪽(@OneToMany쪽)에서 mappedBy 사용해 관계를 맺고 있는 필드를 설정해야 함
public class Study {
@Id @GeneratedValue
private String Long id;
private String name;
@ManyToOne
private Account owner;
}
public class Account {
@Id @GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany(mappedBy = "owner")
private Set<Study> studies = new HashSet<>();
}
- @ManyToOne(이쪽이 주인)
- @OneToMany(mappedBy)
- 주인한테 관계를 설정해야 DB에 반영
데이터를 넣을 때는 주인쪽(FK생성되는 곳)에만 설정해도 관계가 형성 되지만
객체지향 의미상 양쪽다 넣어 두는 것이 좋음
편의를 위한 메소드를 하나 만들어 사용하는 것도 방법
public class Account {
... 생략
public void addStudy(Study study) {
this.getStudies().add(study);
study.setOwner(this);
}
public void removeStudy(Study study) {
this.getStudies().remove(study);
study.setOwner(null);
}
}