
[ 설명 ]
값 타입을컬렉션(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)