Back-end/Spring

[SpringBoot] 엔티티 매핑, 연관관계 매핑

poppy 2022. 2. 6. 21:45
반응형

엔티티 매핑

1. 객체 매핑

@Entity - JPA가 관리하는 엔티티라는 의미

@Table - 엔티티와 매핑할 테이블을 지정, name에 테이블명을 지정하면 된다

@Entity
@Table(name = "orders")
public class Order {
}

 

2. 컬럼 매핑

@Id - 기본키 매핑

@GeneratedValue - 기본키 자동 생성

@Column - 컬럼 매핑, name은 컬럼명

@Enumerated - enum 타입 매핑, EnumType.STRING( = enum 이름을 DB에 저장한다는 의미)을 권장

@Temporal - 날짜 타입 매핑, LocalDate or LocalDateTime을 사용할 때는 생략 가능

@Lob - BLOB, CLOB 매핑

@Transient - 특정 필드를 컬럼에 매핑하지 않는다는 의미

public class Order {

    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

 

연관관계 매핑

1. 일대일 관계

- 일대일 관계에서는 두 테이블 중 한 곳에만 외래키를 두면 된다

- 외래키가 있는 곳이 연관관계의 주인이 되고, 반대편은 mapped By를 적용한다

- 아래 예제에서는 Order가 연관관계의 주인이다

- 주 테이블에서 @JoinColumn으로 대상 테이블의 기본키와 연결한다

- 대상 테이블에서 mappedBy로 주 테이블의 필드명과 연결한다

public class Order {

    @OneToOne
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;
}

public class Delivery {

    @OneToOne(mappedBy = "delivery")
    private Order order;
}

 

2. 일대다 관계

- 일대다 관계에서는 다에 외래키를 둔다 (일에 외래키를 둘 수 있지만 권장하지 않는다)

- 외래키가 있는 곳이 연관관계의 주인이 되고, 반대편은 mapped By를 적용한다

- 아래 예제에서는 Order가 연관관계의 주인이다

- 주 테이블에서 @JoinColumn으로 대상 테이블의 기본키와 연결한다

- 대상 테이블에서 mappedBy로 주 테이블의 필드명과 연결한다

public class Order {

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;
}

public class Member {

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

 

3. 다대다 관계

- 다대다 관계는 @ManyToMany 로 만들 수 있긴 하지만, 일대다 & 다대일 관계로 풀어서 연관관계를 매핑하는 것이 좋다

 

4. 상속관계

@Inheritance - 상속 관계를 매핑, strategy에 상속 전략을 지정한다. 전략은 3가지로 나뉜다.

- JOINED: 조인 전략, 각각 테이블로 변환

- SINGLE_TABLE: 단일 테이블 전략, 통합 테이블로 변환

- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략, 서브타입 테이블로 변환 -> 권장 X

@DiscriminatorColumn - DB에 테이블 타입 저장, name에 컬럼명을 지정할 수 있다

@Discriminator - DB에 저장된 테이블 타입명, 지정하지 않으면 클래스명으로 저장된다

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
public abstract class Item {
}

@Entity
@Discriminator("B")
public class Book extends Item {
}
반응형