값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @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를 사용해 재정의할 수 있다.
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