티스토리 뷰
반응형

들어가며

본 글은 JPA 엔티티에서 연관관계를 지정하는 @ManyToOne 과 @OneToMany 사용법에 대해 다루고 있습니다.
연관관계에 대한 개념적인 내용은 생략되었으며 사용법만을 주로 다루고 있습니다.

 

연관관계 주인

  1. 외래키를 가진쪽이 주인이다.
  2. 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
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함