자바 ORM 표준 JPA 프로그래밍(인프런)

Ch06. 다양한 연관관계 매핑 - 실전 예제(다양한 연관관계 매핑)

webmaster 2021. 12. 13. 11:06
728x90

배송, 카테고리 추가 - 엔티티

Entity 그래프
테이블 구조
Entity 상세

  • 주문과 배송은 1:1(@OneToOne)
  • 상품과 카테고리는 N:M(@ManyToMany)

Delivery Entity

@Entity
public class Delivery {
    @Id
    @GeneratedValue
    private Long id;

    private String city;
    private String street;
    private String zipcode;

    private DeliveryStatus status;

    @OneToOne(mappedBy = "delivery")
    private Order order;
}
  • 일대일 연관관계로 연관관계의 주인이 아닌 Order에 mappedby 옵션을 준다.
    • 일대일 연관관계는 연관관계의 주인이 어디에 있든지 상관없다

Order Entity 수정

Delivery와 일대일 양방향 연관관계를 가진다.

  • 주 테이블에 연관관계의 주인이 되어야 하므로 mappedBy를 쓰지 않았다.

Category Entity

@Entity
public class Category {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

    @ManyToMany
    @JoinTable(name = "CATEGORY_ITEM"
            ,joinColumns = @JoinColumn(name = "CATEGORY_ID")
                            ,inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
    private List<Item> items = new ArrayList<>();
}

 

 

  • Item과 다대다 연관관계를 가진다
    • @JoinTable을 통해 중간 테이블을 두어 다대다 연관관계를 풀어서 작성한다.

Item Entity 수정

Item Entity의 categories는 연관관계의 주인이 아니므로 mappedby 옵션을 추가한다.

N:M 관계는 1:N, N:1로

  • 테이블의 N:M 관계는 중간 테이블을 이용해서 1:N, N:1
  • 실전에서는 중간 테이블이 단순하지 않다.
  • @ManyToMany는 제약: 필드 추가X, 엔티티 테이블 불일치
  • 실전에서는 @ManyToMany 사용X

@JoinColumn 정리

속성  설명  기본값
name  매핑할 외래 키 이름 필드명 + _ + 참조하는 테 이블의 기본 키 컬럼명
referencedColumnName  외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 참조하는 테이블의 기본 키 컬럼명
foreignKey(DDL)  외래 키 제약조건을 직접 지정할 수 있다.
이 속성은 테이블을 생성할 때만 사용한다.
 
unique nullable insertable
updatable columnDefinition table
@Column의 속성과 같다  

 

@ManyToOne - 주요 속성

속성 설명 기본값
optional  false로 설정하면 연관된 엔티티가 항상 있어야 한다.  TRUE
fetch  글로벌 페치 전략을 설정한다.  @ManyToOne=FetchType.EAGER 
@OneToMany=FetchType.LAZY
cascade  영속성 전이 기능을 사용한다.  
targetEntity 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거 의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타 입 정보를 알 수 있다.  

@OneToMany - 주요 속성

속성 설명  기본값
mappedBy  연관관계의 주인 필드를 선택한다.  
fetch  글로벌 페치 전략을 설정한다. @ManyToOne=FetchType.EAGER
@OneToMany=FetchType.LAZY
cascade  영속성 전이 기능을 사용한다.  
targetEntity 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다.  
  • 다대일은 mappedBy가 없다 -> 연관관계의 주인이 되어야 된다는 뜻이다.
728x90