본문 바로가기

JPA

2월 7일 JPA 값타입 컬렉션 저장@ElementCollection ,@CollectionTable

값타입 컬렉션

값 타입을 Collection에 담아 쓰는걸 말한다.

 

객체 구조

 

{Model}

-id : long

-favoriteFoods : set<String>

-addressHistrory : list<Address>

 

DB 구조

{Member}

-MemberId(pk)

 

{Favorite_Foor}

-MemberId(fk , pk)

-Food_name(pk)

//두 컬럼을 조합하여 pk로 사용

 

{Address}

-MemberId(pk , fk)

-City(pk)

-Street(pk)

-Zipcode(pk)

// 컬럼 4개를 묶어서 PK로 사용

 

값타입 컬렉션은 DB테이블에 넣는게 문제인데

값타입이 하나일때는 class에 속성 하나로 넣으면 됬는데

컬렉션은 DB에 담을 수 있는 구조가 없다.

컬렉션은 기본적으로 1:다 관계라서 DB에 넣기위해선 별도의 테이블로 뽑아야 한다.

 

값 타입 컬렉션 매핑

Member 객체에서

@Embadded

private Address homdAddress; 

//임베디드 타입 필드를 사용

 

@ElementCollection // 컬렉션을 저장하겟다고 명시

@CollectionTable(name ="FAVORITE_FOOD " , JoinColumns = @JoinColumn(name = "Member_ID"))

//name ="FAVORITE_FOOD "  : 컬렉션을 저장할 테이블명을 지정

//JoinColumns = @JoinColumn(name = "Member_ID") : Member테이블과 연결할 fk 컬럼

@Column(name = "Food_name") // 컬렉션에 값이 하나일때 컬럼명 변경가능

Private Set<String> favoriteFoods = new HashSet<>();

 

@ElementCollection

@CollectionTable(name = "Address" , JoinColumn = @JoinColumn(name = "Member_ID"))

private List<Address> addressHistory = new ArrayList<>();

 

값타입 컬렉션

-값 타입을 하나 이상 저장할 때 사용

-@ElementCollection , @CollectionTable 사용

-데이터 베이스는 컬렉션을 같은 테이블에 저장할 수 없다.

-컬렉션을 저장하기 위한 별도의 테이블이 필요하다

@ElementCollection // 컬렉션을 저장하겟다고 명시

@CollectionTable(name ="생성할 테이블명 " , JoinColumns = @JoinColumn(name = "FK로 연결한 컬럼명"))

private List<Address> = addressHistory = new ArrayList<>(); // 컬렉션 형태의 필드