자바/JPA
[JPA] 값 타입 컬렉션
OverTheHorizon3410
2023. 11. 9. 18:23
@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