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가 가능 (복잡도 증가)
연관관계 Entity에 대한 영속성 전이 설정
dafault는 아무것도 설정되어있지 않다.
all
- 상위 엔터티에서 하위 엔터티로 모든 작업을 전파refresh
- 데이터베이스로부터 인스턴스 값을 다시 읽어 오기(새로고침)persist
- 연관 Entity를 영속성 콘텍스트에 manage 되게 전이시킨다.merge
- 연관 Entity를 update 할 수 있게 한다.detach
- 연관 Entity를 영속성 콘텍스트에서 관리하지 않는다.remove
- 연관 Entity를 함께 제거한다.orphanRemoval - 연관 Entity만 삭제하고 싶을 때 사용한다.
set...(null)을 할 경우 외래키가 없는 것으로 update 된다.
이때 자동으로 연관 설정이 없는 Entity를 DB에서 제거하고자 할 때 사용한다.
(cascade는 set..(null)로 동작하지 않는다.)
가장 먼저 lazy를 사용하기 위해선 Entity가 영속성 컨테이너에 관리되어지고 있어야 한다.
연관 관계 Entity가 필요할 때만 get()으로 연관 Entity를 select를 통해 나중에 가져온다.
연관 관계 Entity를 영속성 컨테이너로 전부 즉시 가져온다.
⇒ LAZY가 보편적 권장 사항
순환참조 해결방법 참고
Json 형태로 만들기 위해서는 참조를 할 수 밖에 없는데,
참조 엔티티에서 다시 참조를 해서 순환참조가 된다.
entity 자체를 리턴하지 않는다.
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;
Json 데이터에 해당 데이터가 null 로 들어간다.