JVM/JPA

값 타입 컬렉션 @ElementCollection @CollictionTable

kyoulho 2023. 6. 25. 15:57
  • 값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @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;
}

'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