티스토리 뷰
반응형
들어가며
본 글은 JPA 엔티티에서 연관관계를 지정하는 @ManyToOne 과 @OneToMany 사용법에 대해 다루고 있습니다.
연관관계에 대한 개념적인 내용은 생략되었으며 사용법만을 주로 다루고 있습니다.
연관관계 주인
- 외래키를 가진쪽이 주인이다.
- 1:N 관계라면 N쪽이 외래키를 가지므로 주인이다.
@ManyToOne + @JoinColumn
- 1:N 관계에서 "N" 쪽에 사용하는 어노테이션
- @ManyToOne을 사용하는 엔티티가 연관관계의 주인이라고 할 수 있습니다.
- 일반적으로 @JoinColumn 어노테이션과 함께 사용됩니다.
- @JoinColumn 어노테이션은 외래키 컬럼명(name = "xx_id")을 명시해줍니다.
- fetch = FetchType.LAZY or EAGER 로 Fetch 타입을 지정해줄 수 있으며, 기본값은 EAGER 입니다.(즉시로딩, 지연로딩)
- 지연로딩 시, N+1 문제를 주의하는 것이 좋습니다.
public class ItemType {
...
@ManyToOne
@JoinColumn(name = "item_id")
private Item item;
}
@OneToMany + mappedBy
- 1:N 관계에서 "1" 쪽에 사용하는 어노테이션
- Collection 타입(List, Map 등)에만 사용이 가능합니다.
- @OneToMany(mappedBy="xx") 속성을 사용해 연관관계의 주인을 N(다) 쪽으로 지정해줍니다.
- mappedBy의 값에는 연관된 엔티티의 필드명을 작성합니다.
- 마찬가지로 fetchType을 지정해 줄 수 있으며, 기본값은 LAZY입니다.
- cascade 옵션을 지정하여, 부모 엔티티의 작업이 자식 엔티티에게 영향을 미치도록 할 수 있습니다.
- orphanRemoval 옵션으로 부모엔티티와의 관계가 끊어진 자식 엔티티를 자동으로 삭제할 수 있습니다.
public class Item {
...
@OneToMany(mapppedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ItemType> itemType = new ArrayList<>();
}
참고
불필요한 양방향 연관관계나 기타 옵션들은 예상치 못한 런타임 에러를 발생시킬 수 있으므로 되도록이면 단방향 관계만을 사용하고, 양방향은 꼭 필요한 경우에만 사용하는 것이 좋습니다.
반응형
'Java & Spring' 카테고리의 다른 글
DelegatingFilterProxy (1) | 2023.12.11 |
---|---|
build.gradle Java 버전 명시하기 (0) | 2023.10.13 |
[Spring] ApplicationContext (0) | 2023.08.26 |
Web Server / Web Application Server / Web Container (0) | 2023.08.22 |
[Java] Comparator.compare Overriding (0) | 2023.08.05 |
댓글