Member에서
@ElementCollection
@CollectionTable(name = "Address" , JoinColumn = @JoinColumn(name = "Member_ID"));
//name = "Address" : 생성될 테이블 명
//JoinColumn = @JoinColumn(name = "Member_ID") : fk 와 pk 로 연결할 컬럼
private List<Address> addressHistory = new ArrayList()<>;
위 처럼 값타입 컬렉션을 쓰던것을
@Entity
@Table(name = "address")
public class AddressEntity;
//엔티티 클래스를 생성후
@OneToMany(cascade = CascadeType.All ,orphanRemoval = true)
//@OneToMany 다대일 관계
//cascade = CascadeType.All : 영속성 존속
//orphanRemoval = true : 고아객체 처리
@JoinColumn(name = "Member_ID")
private List<addressEntity> addressHistory = new ArrayList<>();
값타입 컬렉션 대신 엔티티 컬렉션을 사용한다
이렇게 되면 엔티티 이기 때문에 고유의 식별자 PK가 생겨서 변경삭제가 용이하고
변경삭제시 모두 삭제후 남은값 넣기의 문제점이 해결된다.
엔티티이기 때문에 값 추적이 가능해진다,
그럼 값타입 컬렉션은 언제쓰나
값을 추적할 필요 없는 단순한 로직에 사용
엔티티 타입의 특징
-식별자가 있다
-생명주기가 관리된다.
-공유 된다.
값타입의 특징
-식별자가 없다
-생명주기를 엔티티에 의존한다.
-공유되지 않는것이 안전하다 (복사해서사용)
-불변객체를 만드는것이 안전
값타입은 정말 값타입이라 판단 될때만 사용
엔티티와 값타입을 혼동해서 엔티티를 값타입으로 만들면 안된다.
식별자가 필요하고 지속해서 값을 추적 , 변경해야한다면 그것은 값타입이 아니라 엔티티가 적합하다.
결론 값타입은 단순한 구조일때 사용하고 엔티티를 사용하자
<값타입 컬렉션>
@ElementCollection
@CollectionTable(name = "Address" , JoinColumn = @JoinColumn(name = "Member_ID"));
private List<Address> addressHistory = new ArrayList()<>;
//구조가 단순할 때 사용
<컬렉션을 가진 엔티티>
@Entity
@Table(name = "address")
public class AddressEntity;
@OneToMany(cascade = CascadeType.All ,orphanRemoval = true)
@JoinColumn(name = "Member_ID")
private List<addressEntity> addressHistory = new ArrayList<>();
//일반적으로 컬렉션 형태의 필드가 필요할땐 이 형태를 사용
'JPA' 카테고리의 다른 글
| 2월 10일 JPA 객체지향쿼리 언어(JPQL) (표준문법) (0) | 2023.02.10 |
|---|---|
| 2월 9일 JPA 실전예제 6 값 타입 매핑 (0) | 2023.02.09 |
| 2월 9일 JPA 값타입 컬렉션 조회 예제 지연로딩 전략사용 (0) | 2023.02.09 |
| 2월 7일 JPA 값타입 컬렉션에 값 넣기 (0) | 2023.02.07 |
| 2월 7일 JPA 값타입 컬렉션 저장@ElementCollection ,@CollectionTable (0) | 2023.02.07 |