@Embedded, @Embeddable
사용 예
@Embeddable
@Getter
public class Adress {
private String city;
private String street;
private String zipcode;
protected Address() {
}
public Adress(String city, String street, String zipcode) {
super();
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
@Entity
@Getter
@Setter
public class Delivery {
@Id
@GeneratedValue
@Column(name = "delivery_id")
private Long id;
@OneToOne(mappedBy = "delivery")
private Order order;
@Embedded
private Adress adress;
@Enumerated(EnumType.STRING)
private DeliveryStatus status;
// READY(준비), COMP(배송)
}
앞의 Adress 클래스에 주소를 표현하는 3개의 데이터가 있다. 그 데이터를 1개의 '주소'라는 의미의 객체로 표현, 가독성이 좋은 코드로 만들 수 있다.
JPA Entity안의 Column을 하나의 객체로서 사용하고 싶다면 두 어노테이션을 사용하여야 한다.
@Embeddable : 값 타입을 정의하는 곳에 표시
@Embedd : 값 타입을 사용하는 곳에 표시
값타입은 변경 불가능하게 설계해야 한다.
@Setter를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스로 만들어야 함.
기본생성자를 public또는 protexted로 설정해야한다.
@Enumerated
public enum DeliveryStatus {
READY, COMP
}
자바 enum 타입을 텐티티 클래스의 속성으로 사용할 수 있다.
@Enumerated 어노테이션에는 두가지 EnumType이 존재
1. @Enumerated(EnumType.ORDINAL)
=> enum 순서 값을 저장, 순서를 Integer값으로 변환하여 DB에 저장.
ex) 위의 DeliveryStatus.COMP 값으로 셋팅하면 2가 DB에 저장된다.
2. @Enumerated(EnumType.STRING)
=> enum 이름을 저장, String 타입으로 변환하여 DB에 저장.
ex) COMP 라는 문자열 자체가 저장 된다.
'백엔드개발자 > SPRING, JPA 등...' 카테고리의 다른 글
@Transactional, @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (0) | 2022.02.13 |
---|---|
cascade , 연관관계 메서드 (0) | 2022.02.13 |
@Inheritance, @DiscriminatorColumn, @DiscriminatorValue (0) | 2022.01.28 |
@Id / @GeneratedValue / @Transactional (0) | 2022.01.28 |
컴포넌트 스캔과 의존관계 자동 주입시키기 (0) | 2022.01.23 |