엔티티 매핑
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 {
}
'Back-end > Spring' 카테고리의 다른 글
[SpringBoot] 페치 조인 (Fetch Join) (0) | 2022.04.06 |
---|---|
[SpringBoot] 지연 로딩과 즉시 로딩 (0) | 2022.03.31 |
[Spring] 영속성 컨텍스트 (0) | 2022.01.26 |
[SpringBoot] 컴포넌트 스캔과 의존관계 자동 주입 (@Component, @Autowired, @RequiredArgsConstructor) (0) | 2022.01.16 |
SOLID 적용하여 리팩토링하기 (0) | 2022.01.10 |