✔ 값 타입 컬렉션

값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다.

@Entitypublic class Member{    @Id @Generated    private Long id;    @Embedded    private Address homeAddress;    @ElementCollection    @CollectionTable(name = "FAVORITE_FOOD",        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<>();    ...}@Embeddablepublic class Address{    @Column    private String city;    private String street;    private String zipcode;    ...}

Member 엔티티에 값 타입 컬렉션을 사용하는 favoriteFoods, addressHistory@ElementCollection을 지정했다.

favoriteFoods는 기본값 타입인 String을 컬렉션으로 가진다.

이것을 데이터베이스 테이블로 매핑해야 하는데 관계형 데이터베이스의 테이블은 컬럼안에 컬렉션을 포함할 수 없다.

따라서 별도의 테이블을 추가하고 @CollectionTable를 사용해 추가한 테이블을 매핑해야 한다.

그리고 favoriteFoods처럼 값으로 사용되는 컬럼이 하나면 @Column을 사용해서 컬럼명을 지정할 수 있다.

addressHistory는 임베디드 타입인 Address를 컬렉션으로 가진다.

이것도 마찬가지로 별도의 테이블을 사용해야 한다.

그리고 테이블의 매핑정보는 @AttributeOverride를 사용해 재정의할 수 있다.

1. 값 타입 컬렉션 사용

Member member = new Member();//임베디드 값 타입member.setHomeAddress(new Address("통영", "몽돌해수욕장", "660-123"));//기본값 타입 컬렉션member.getFavoriteFoods().add("짬뽕");member.getFavoriteFoods().add("짜장");member.getFavoriteFoods().add("탕수육");//임베디드 값 타입 컬렉션member.getAddressHistory().add(new Address("서울", "강남", "123-123"));member.getAddressHistory().add(new Address("서울", "강북", "000-000"));em.persist(member);

마지막에 member 엔티티만 영속화했다.

JPA는 이때 member 엔티티의 값 타입도 함께 저장한다.

실제 DB에 실행되는 INSERT SQL