@Test
public void valueTypeCollection() {
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);
em.flush();
}
@Entity
@Setter
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private 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 Set<Address> addressHistory = new HashSet<>();
}
@Embeddable
@AllArgsConstructor
@NoArgsConstructor
class Address {
@Column
private String city;
private String street;
private String zipcode;
}
- member 엔티티만 영속화함.
- SQL
- member INSERT SQL 수행
insert into member (city, street, zipcode) values (?, ?, ?)
- homeAddress 컬렉션이 아니고 임베디드 값 타입이기에 회원 테이블 저장 SQL 이 수행
insert into address (member_id, city, street, zipcode) values (?, ?, ?, ?)
- favoriteFoods 3가지가 INSERT 된다.
- addressHistory 2가지가 INSERT 된다.
Uploaded by N2T
'자바 > JPA' 카테고리의 다른 글
[JPA] 조건식 (0) | 2023.11.10 |
---|---|
[JPA] 값 타입과 불변 객체 (0) | 2023.11.10 |
[JPA] 값 타입 컬렉션 개요 (0) | 2023.11.09 |
[JPA] 값 타입 컬렉션 제약사항과 대안적 접근 방법 (0) | 2023.11.09 |
[JPA] 객체지향 쿼리 (0) | 2023.11.09 |