- 값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @Elementcollection, @CollectionTable 어노테이션을 사용한다.
- 값 타입 컬렉션은 영속성 전이와 고아 객체 제거 기능을 필수로 가지고 있다.
- 값 타입 컬레션도 조회할 때 페치 전략을 선택할 수 있는데 LAZY가 기본이다.
- 값 타입 컬렉션에 변경 사항이 발생하면 값 타입 컬렉션이 매핑된 테이블의 연관된 모든 데이터를 삭제하고, 현재 값 타입 컬렉션 객체이 있는 모든 값을 데이터베이스에 다시 저장한다. 따라서 값 타입 컬렉션이 매핑된 테이블에 데이터가 많다면 일대다 관계를 고려해야 한다.
예제
Member 엔티티 하나의 3개의 테이블을 사용하고 있는 예제이다.
@Entity
public class Member {
@Id
@GeneratedValue
public Long id;
@Embedded
private Address homeAddress;
@ElementCollection
@CollectionTable(name = "FAVORITE_FOODS",
joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS",
joinColumns = @JoinColumn(name = "MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<>();
}
@Embeddable
public class Address {
private String city;
private String street;
private Strng zipcode;
}
개선
@Entity
public class Member {
@Id
@GeneratedValue
public Long id;
@Embedded
private Address homeAddress;
@ElementCollection
@CollectionTable(name = "FAVORITE_FOODS",
joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();
@OneToMany(cascade = CascadeType.All, orphanRemoval = true)
@Joincolumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<>();
}
@Entity
public class AddressEntity {
@Id
@GeneratedValue
private Long id;
@Embedded
Address address;
}
@Embeddable
public class Address {
private String city;
private String street;
private Strng zipcode;
}
728x90
'JVM > JPA' 카테고리의 다른 글
JPQL 조인과 페치조인 (0) | 2023.06.25 |
---|---|
JPQL 기초 (0) | 2023.06.25 |
임베디드 타입(복합 값 타입) @Embedded, @Embeddable (0) | 2023.06.24 |
영속성 전이, 고아 객체 (0) | 2023.06.23 |
즉시 로딩, 지연 로딩, 프록시 (0) | 2023.06.23 |