JPA 일대다 내맘대로 정리

Jimin·2023년 4월 13일
0

내 맘대로 정리하기

목록 보기
10/14

연관관계 매핑 참고

일대다

member : reservation
OneToMany : ManyToOne

example

	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    @Builder.Default
    @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private List<Comment> commentList = new ArrayList<>();

    @Builder.Default
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<PostImage> postImageList = new ArrayList<>();

    @Builder.Default
    @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private List<PostLike> postLikeList = new ArrayList<>();

양방향 매핑 두 가지 방법

(1) JoinColumn(외래 키가 있는 곳에 설정), mappedBy(외래키가 없는 곳에 설정)
연관 관계의 주인을 외래키가 있는 곳으로 설정, 권장되는 방식

외래키가 존재하는 Entity에서 연관 Create, Select, Update, Delete가 가능

mappedBy 쪽에서도 cascade 설정하면 Insert 빼고는 다 전이된다.

(2) JoinColumn(외래 키가 없는 곳에 설정)
연관 관계의 주인을 외래키가 없는 곳으로 설정, 편의를 위해 성능을 희생시키는 방식

양쪽 모두 Create, Select, Update, Delete가 가능 (복잡도 증가)

Cascade

연관관계 Entity에 대한 영속성 전이 설정

JPA Cascade Types

dafault는 아무것도 설정되어있지 않다.

  • all - 상위 엔터티에서 하위 엔터티로 모든 작업을 전파
  • refresh - 데이터베이스로부터 인스턴스 값을 다시 읽어 오기(새로고침)
    연결된 하위 엔티티까지 인스턴스 값 새로고침
  • persist - 연관 Entity를 영속성 콘텍스트에 manage 되게 전이시킨다.
    하위 엔티티까지 영속성 전달, Member Entity를 저장하면 Reservation Entity도 저장
  • merge - 연관 Entity를 update 할 수 있게 한다.
    하위 엔티티까지 병합 작업을 지속, Reservation과 Member 엔티티를 조회한 후 업데이트
  • detach - 연관 Entity를 영속성 콘텍스트에서 관리하지 않는다.
    영속성 컨텍스트에서 엔티티 제거, 연결된 하위 엔티티까지 영속성 제거
  • remove - 연관 Entity를 함께 제거한다.
    하위 엔티티까지 제거 작업을 지속, 연결된 하위 엔티티까지 엔티티 제거

orphanRemoval - 연관 Entity만 삭제하고 싶을 때 사용한다.

set...(null)을 할 경우 외래키가 없는 것으로 update 된다.
이때 자동으로 연관 설정이 없는 Entity를 DB에서 제거하고자 할 때 사용한다.
(cascade는 set..(null)로 동작하지 않는다.)

Casecase 참고

Entity를 영속성 컨텍스트에서 사용할 때 연관 Entity 설정 (fetch type)

fetchType 참고

LAZY

가장 먼저 lazy를 사용하기 위해선 Entity가 영속성 컨테이너에 관리되어지고 있어야 한다.
연관 관계 Entity가 필요할 때만 get()으로 연관 Entity를 select를 통해 나중에 가져온다.

EAGER

연관 관계 Entity를 영속성 컨테이너로 전부 즉시 가져온다.

⇒ LAZY가 보편적 권장 사항

JPA 연관관계 참고


순환참조 해결방법

순환참조 해결방법 참고
Json 형태로 만들기 위해서는 참조를 할 수 밖에 없는데,
참조 엔티티에서 다시 참조를 해서 순환참조가 된다.

DTO 객체 생성

entity 자체를 리턴하지 않는다.

JsonBackReference, JsonManagedReference

  • JsonBackReference - 자식 클래스쪽에 추가 (다)
  • JsonManagedReference - 부모 클래스쪽에 추가 (일)

member

	@JsonManagedReference
    @OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE)
    private List<Reservation> reservationLogs;

reservation

	@JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

JsonIgnore

Json 데이터에 해당 데이터가 null 로 들어간다.

profile
https://github.com/Dingadung

0개의 댓글