@ManyToOne
1:다 관계의 엔티티에서 다쪽 엔티티에 설치되는 필드의 어노테이션
DB 테이블 적으로 보면 외래키를 가지고 있으므로 JoinColumn 또한 해주어야 함
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id") // 외래키 이름
private Product product;
@OneToMany
1:다 관계의 엔티티에서 1쪽 엔티티에 설치되는 필드의 어노테이션
mapped by를 통해 다쪽의 엔티티에서 어떠한 값과 매핑이 되는지 표시
@OneToMany(fetch = FetchType.LAZY, mappedBy = "product")
private List<Order> orders = new ArrayList<Order>();
@Embeddable - @Embedded
entity 내부의 객체형 필드
객체와 테이블을 정교하게 매핑할 수 있음
객체지향적으로 응집력을 높일 수 있음
@Embedded
private Address address
@Embeddable
class Address{
private String zipCode;
private String city;
private String street;
protected Address(){} // 보안상 protected로 설정하는 것이 안전 -> JPA 리플랙션 위해
public Address(String city, String street, String zipCode){
this.city = city;
this.street = street;
this.zipCode = zipCode;
}
}
@Inheritance(strategy = InheritanceType.XXX)
DB를 객체 상속적으로 표현하기 위함
- JOINED - 가장 정규화된 스타일로 상속 : 하위 테이블 입장에서는 상위 테이블의 id를 pk이자 외래키로 인지
- SINGLE_TABLE - 상속 엔티티들의 필드를 하나의 테이블에 넣기
- TABLE_PER_CLASS - 하위 클래스가 각각의 테이블로 나누어짐 - 부모테이블 속성이 하위테이블 속성으로 중복되어 들어감
확장성이 높으면 일반적으로 JOINED 전략을 채택
비즈니스 로직이 심플하고 확장성도 낯으면 SINGLE_TABLE 전략 채택
@DiscriminatorColumn(name = "하위연결위한키이름")
DB에는 name에 들어간 값으로 속성 이름이 결정됨
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype")
@Getter
public class Item{
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String title;
priavte int price;
private int stack;
}
@DiscriminatorValue("값")
상위 테이블 엔티티를 반드시 상속받아야 한다.
JOINED 전략이나 SINGLE_TABLE 전략 채택 시, 상위 테이블(JOINED 전략)과 단일테이블(SINGLE_TABLE 전략)에 외래키 혹은 필드로 들어간 속성의 값에 들어가는 값
@Entity
@DiscriminatorValue("M")
@Getter
public class Movie extends Item{
private String director;
private String actor;
}
@Enumerated(EnumType.XXX)
상태 등등 정해진 항목이 있는 값들을 표현하기 위해 enum을 사용하는 경우
- ORDIINAL - enum의 순서 값 int를 DB에 저장 (1, 2, 3....)
- STRING - enum에 선언된 이름 string 자체를 DB에 저장
@Entity
@Getter
public class order{
@Id
@GeneratedValue
private Long id;
///생략
@Enumerated(EnumType.STRING)
private Status status;
}
public enum Status{
READY, DELIVERY, COMPLETE
}
하지만 이러한 방법은 나중에 enum의 상태가 변경되었을 때, 혼란스러워진다는 단점이 있다고 한다
AttributeConverter가 대안이라는데 이는 참고 블로그 링크만 남겨두고 나중에 공부해야겠다
https://lng1982.tistory.com/279
'Spring > boot' 카테고리의 다른 글
[Spring Boot] 개발 단계에서 테스트를 위한 DB data 만들기 (0) | 2022.02.18 |
---|---|
[JPA] DB의 data가 update 되는 플로우 정리 (0) | 2022.02.18 |
[Spring Boot] Rest Controller DTO 의 필요성 (0) | 2022.02.15 |
Spring Boot - Test 코드 작성 (0) | 2022.01.04 |
spring boot Service 코드 repository injection관련 (0) | 2021.12.27 |