@OneToMany, @ManyToOne - 1

달래·2024년 1월 12일
0

JPA

목록 보기
7/9

@OneToMany

  • 부모

@ManyToOne

  • 자식

양방향 연관관계 :
@OneToMany <-> @ManyToOne 서로의 연관된 Entity가 조인하는경우

단방향 연관관계 :
@ManyToOne 또는 @OneToMany에 연관된 Entity가 조인되지 않은 경우 (@ManyToOne의 경우 연관 Entityp에 @OneToMany가 없는 경우)

연관관계의 주인

주인 Entity =/ 부모 Entity

부모자식 관계 : 의존도 (부모 없이는 자식 Entity가 있을 수 없다)
주인 관계 : DB에 저장되는 FK를 어떤 엔티티가 삽입, 수정, 삭제를 담당하는지에 따라 정해짐

즉, 양방향 연관관계의 경우 주로 Many를 담당하는 자식 Entity가 주인이 되는 경우가 많음.
(단방향 : 부모 Entity가 주인이 된다)

단방향


1. @OneToMany

부모.

public class Member {
	@OneToMany
    @JoinColumn(name = "member_no")
    private List<Diary> diaries;
}

@JoinColumn

  • 사용해야 효율적으로 사용할 수 있다. (자식엔티티 제거할때 성능이슈x)
  • 상대 Entity 테이블(Diary)에 fk가 있음을 알려주는 역할
    잘 사용하지 않는다.

2. @ManyToOne

자식.
많이 사용됨

public class Diary {
	@ManyToOne
    @JoinColumn(name = "member_no")
    private Member writer;
}

@JoinColumn : fk컬럼 정의

@양방향


public class Diary {
	@OneToMany(mappedBy = "diary") //  상대 엔티티에서 어떻게 매핑이 되어 있는 지를 설명
    private List<Comment> comments;
}

@OneToMany에 mappedBy를 설정하지 않으면 @OneToMany가 단방향처럼 취급되어 중간 테이블이 생성

public class Comment {
	@ManyToOne
    @JoinColumn(name = "diary_no") // 같은 테이블 내에서 FK 칼럼을 정의
    private Diary diary;
}

자식 Entity에 영향

프록시 옵션: fetch
해당 객체를 DB에서 조회할 때, 연관관계에 있는 엔티티의 정보를 언제 같이 끌어올 지에 대한 옵션입니다.

  1. Lazy Fetch

연관관계에 있는 엔티티에 접근할 때, DB에 쿼리를 날려 엔티티를 조회
접근하지 않는 경우, 쿼리가 발생x

  1. Eager Fetch

상대 엔티티의 조회 여부와 상관없이, 쿼리가 발생

@OneToMany의 기본값은 Lazy Fetch이며, @ManyToOne의 기본값은 Eager Fetch입니다.

Eager Fetch, Lazy Fetch 상관 없이 단건 조회가 아닌 컬렉션 조회에서 N+1 문제가 발생할 수 있음.

참고
https://velog.io/@goniieee/JPA-OneToMany-ManyToOne%EC%9C%BC%EB%A1%9C-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0

profile
아좌잣~!

0개의 댓글