이것은 매우 일반적인 질문 이므로이 답변을 기반으로하는이 기사를 작성
했습니다.
단방향 일대 다 연결
이 기사 에서 설명했듯이 @OneToMany
와 함께 주석 을 사용 하면 다음 다이어그램 @JoinColumn
의 상위 Post
엔터티와 하위 엔터티와 같은 단방향 연결이 있습니다 PostComment
.
단방향 일대 다 연관을 사용하는 경우 상위 측만 연관을 맵핑합니다.
이 예에서는 Post
엔터티 만 @OneToMany
하위 PostComment
엔터티에 대한 연결을 정의합니다 .
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
양방향 일대 다 연관
속성 세트 @OneToMany
와 함께 with 를 사용하면 mappedBy
양방향 연관이 있습니다. 이 경우 엔터티에는 다음 그림 과 같이 자식 엔터티 Post
모음이 PostComment
있고 자식 PostComment
엔터티에는 부모 엔터티에 대한 참조가 있습니다 Post
.
에서 PostComment
엔티티는 post
다음과 같이 개체 속성 매핑됩니다 :
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
fetch
속성을 명시 적으로 설정 한 이유는 FetchType.LAZY
기본적으로 모든 연결 @ManyToOne
과 @OneToOne
연결을 열심히 가져 와서 N + 1 쿼리 문제를 일으킬 수 있기 때문입니다. 이 주제에 대한 자세한 내용은 이 기사를 확인 하십시오 .
에서 Post
엔티티는 comments
다음과 같이 연관 매핑된다 :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
mappedBy
의 속성 @OneToMany
주석을 참조합니다 post
자식 재산 PostComment
법인과이 방법은, Hibernate는 양방향 연관이에 의해 제어되는 것을 알고 @ManyToOne
이 테이블 관계에 기반으로하는 외래 키 컬럼 값을 관리하는 담당 측면.
양방향 연결을 위해서는 addChild
and와 같은 두 가지 유틸리티 방법이 필요합니다 removeChild
.
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
이 두 가지 방법은 양방향 연결의 양쪽이 동기화되지 않도록합니다. 양쪽 끝을 동기화하지 않으면 Hibernate는 연결 상태 변경이 데이터베이스로 전파 될 것이라고 보장하지 않습니다.
JPA 및 Hibernate와 양방향 연관을 동기화하는 최상의 방법에 대한 자세한 내용은 이 기사를 확인 하십시오 .
어느 것을 선택해야합니까?
단방향 @OneToMany
협회는 매우 잘 수행하지 않습니다 당신이 그것을 피해야한다, 그래서.
보다 효율적인 양방향 @OneToMany
을 사용하는 것이 좋습니다 .