[ 설명 ]
값 타입
을컬렉션(List, Set)
에 담아서 쓰는 변수RDB
에는다수의 데이터
를 하나로 저장하는 구조가 없다
--> 테이블로 따로 분리해야 함 (1:N관계)
[ 사용 ]
Member
객체에값 타입 컬렉션
2개를 추가 (favoriteFoods
/addressHistory
)
@ElementCollection
: 값타입 컬렉션임을 알리는 어노테이션@CollectionTable
: 새로 생길테이블
지정 &joinColumn
지정
[ 저장 ]
- 중요한 것!
:값 타입 컬렉션
을 따로em.persist()
해주지 않아도 내부적으로 처리된다!값타입 컬렉션
은영속성 전이(cascade)
+고아 객체 제거 기능(orphanRemoval)
을 필수로 가짐
[ 조회 ]
- 조회할때 단순
embedded 타입
은 바로 조회된다(embedded type
은DB
관계X)값타입 컬렉션
은 지연로딩으로 설정된다(실제 table을 생성하기 때문)
[ 수정 ]
remove
할 때equals() 재정의
가 반드시 필요
--> 삭제할 요소를 찾을때 기본equals()
는 인스턴스를 비교해서 찾을 수 없게됨
그래서동등성 비교
를 해야 찾아서 삭제할 수 있다.- 삭제하는 과정에서 생성되는 query를 살펴보면
값타입 컬렉션
의 제약사항을 볼 수 있음
- (요청)
MEMBER_ID
를 가진 데이터 하나를 삭제
-->MEMBER_ID
관련 데이터 모두 삭제
--> 삭제하는 요소를 제외한 나머지 데이터(원래 있던 값
+새로 추가하는 값
)을 전부insert query
로 날림
--> 하나만 삭제하면 되는데 왜 다delete
하고 전부 다시insert
할까?
:값타입 컬렉션
은식별자
를 따로 보유하지 않아서 이렇게 동작함
- 결과적으로
값 타입 컬렉션
은 실무에서 권장X
-->Entity로 승격
해서1:N 단방향
orN:1 양방향
연관관계 해야함
RDB
에서1:N관계
는 무조건 테이블로 따로분리
해야 함값 타입 컬렉션
은 실무에서 권장되지 않는다.- 대신,
Entity 승격
+테이블 연관관계
+cascade + orphanRemoval
설정
ex)