값 타입인 경우
@Entity
public class DeliveryJpaEntity {
...
@Embedded // 생략 가능
private AddressJpaEntity address;
...
}
@Embeddable
public class AddressJpaEntity {
private String address;
private String ji;
private String bun;
}
값 타입 컬렉션인 경우
- 값 타입을 컬렉션에 담아서 쓰는 걸 값 타입 컬렉션이라 한다.
- 값 타입 컬렉션은 영속성 전이(Casecade)와 고아 객체 제거(Orphan remove)가 Default 이다.
@Entity
public class DeliveryJpaEntity {
...
@ElementCollection // 기본 fetch 전략은 lazy 이다.
@CollectionTable(name = "delivery_item", joinColumns = @JoinColumn(name = "delivery_id"))
private List<DeliveryItemJpaEntity> deliveryItems = new ArrayList<>();
...
}
@Embeddable
public class DeliveryItemJpaEntity {
private String name;
private Long quantity;
private BigDecimal amount;
}
값 타입 컬렉션의 한계
엔티티는 ID로 DB에서 찾을 수 있기 때문에 쉽게 CRUD가 가능하나, 값 타입은 식별자라는 개념이 없기에 원본데이터를 찾기 어렵다, 값 타입 컬렉션은 별도의 테이블에 저장되는데 이 테이블 안에 있는 값타입의 값이 변경 되면 기존 값 타입 컬렉션을 제거하고 컬렉션 전체를 새롭게 저장하는 방식으로 이뤄진다. 때문에 컬렉션의 양이 많아지면 쿼리 수가 많아지기 때문에 컬렉션의 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계 엔티티로 수정하는 것을 고려해야 한다.
반응형
'SpringBoot > JPA' 카테고리의 다른 글
계층형 테이블 구현 (1) | 2024.10.09 |
---|---|
Inheritance 전략 (0) | 2024.10.08 |
Springboo3 으로 변경 했을시에 QueryDSL 변경 점 (0) | 2023.06.09 |