위 테이블을
임베디드 타입 적용 후 Member 테이블이 간소화 할 수 있다.
@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> addressesHistory = new ArrayList<>();
값 타입 컬렉션 사용
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(new Address("homeCity", "street", "10000"));
member.getFavoriteFoods().add("치킨");
member.getFavoriteFoods().add("피자");
member.getFavoriteFoods().add("족발");
member.getAddressesHistory().add(new Address("old1", "street", "10000"));
member.getAddressesHistory().add(new Address("old2", "street", "10000"));
em.persist(member);
tx.commit();
Member findMember = em.find(Member.class, member.getId());
List<Address> addressesHistory = findMember.getAddressesHistory();
for (Address address : addressesHistory) {
System.out.println("address.getCity() = " + address.getCity());
}
Set<String> favoriteFoods = findMember.getFavoriteFoods();
for (String favoriteFood : favoriteFoods) {
System.out.println("favoriteFood = " + favoriteFood);
}
tx.commit();
Member findMember1 = em.find(Member.class, member.getId());
// homeCity -> newCity
// findMember.getHomeAddress().setCity("newCity"); 잘못된 방법
Address a = findMember1.getHomeAddress();
findMember1.setHomeAddress(new Address(a.getCity(), a.getStreet(), a.getZipcode()));
// 치킨 -> 한식
findMember1.getFavoriteFoods().remove("치킨");
findMember1.getFavoriteFoods().add("햄버거");
findMember1.getAddressesHistory().remove(new Address("old1", "street", "10000"));
findMember1.getAddressesHistory().add(new Address("newCity1", "street", "10000"));
tx.commit();
참고) 값 타입 컬렉션은 영속성 전에(Casecade) + 고아 객체 제거 기능을 필수로 가진다고 볼 수 있다.