[JPA & Hibernate] Entity Relationships

원알렉스·2020년 8월 14일
0

JPA

목록 보기
8/16
post-thumbnail
post-custom-banner

깃허브 소스코드
Udemy 강의영상

연관관계 설정 시 주의 사항

  • 데이터베이스 내의 데이터 중복을 방지하기 위해 한쪽 엔티티만을 연관관계의 주인으로 설정

✔ @OneToOne

  • 기본적으로 FetchTypeEager로 설정되어 있음
  • 연관관계의 주인을 설정할 때, 주인이 아닌 쪽에 mappedBy = {변수명}을 설정해주면 됨

Student 클래스

@OneToOne(fetch = FetchType.LAZY)
private Passport passport;

Passport 클래스

@OneToOne(fetch = FetchType.LAZY, mappedBy = "passport")
private Student student;

✔ @ManyToOne, @OneToMany

  • 기본적으로 @ManyToOneFetchTypeEager로 설정되어 있음
  • 기본적으로 @OneToManyFetchTypeLazy로 설정되어 있음
  • 연관관계의 주인은 @ManyToOne 쪽에 설정, 즉 mappedBy = {변수명}@OneToMany 쪽에 설정

Review 클래스

@ManyToOne(fetch = FetchType.LAZY)
private Course course;

Course 클래스

@OneToMany(mappedBy = "course")
private List<Review> reviews = new ArrayList<>();

✔ @ManyToMany

  • 기본적으로 @ManyToManyFetchTypeLazy로 설정되어 있음
  • 기본적으로 두 엔티티의 주키를 가지고 두개의 JoinTable을 생성해줌
    (COURSE_STUDENTS, STUDENT_COURSES)
  • 그러나 이것은 좋지 않은 데이터베이스 설계이므로 둘 중에 한쪽을 연관관계의 주인으로 설정해줌으로써 문제 해결 가능
  • @JoinTable은 연관관계의 주인 쪽에 설정
  • joinColumns는 주인 쪽의 주키 설정
  • inverseJoinColumns는 주인이 아닌 쪽의 주키 설정

Student 클래스(연관관계 주인)

@ManyToMany
@JoinTable(
    name = "STUDENT_COURSE",
    joinColumns = @JoinColumn(name = "STUDENT_ID"),
    inverseJoinColumns = @JoinColumn(name = "COURSE_ID")
)
private List<Course> courses = new ArrayList<>();

Course 클래스

@ManyToMany(mappedBy = "courses")
private List<Student> students = new ArrayList<>();
profile
Alex's Develog 🤔
post-custom-banner

0개의 댓글