JPA의 데이터 타입을 크게 분류하면 entity 타입, value 타입으로 나눌 수 있다고 함.
entity 타입은 식별자를 통해 추적 가능, value 타입은 식별자가 없어서 추적할 수 없다고 함
@Entity
public class Member{
...
private String name;
private int age;
...
}
@Entity
public class Member{
...
@Embedded // Value 타입을 사용하는 곳에 명시
Period workPeriod;
@Embedded
Address homeAddress;
...
}
@Embeddable // Value 타입을 정의하는 곳에 명시
public class Period{...}
@Embeddable
public class Address{...}
embedded 타입 써도 똑같음.
...
@AttributeOverride 이용
테이블에 매핑하는 컬럼명이 중복되는 경우 다른 매핑 정보를 정해줄 수 있음
@Entity
Member{
@Embedded Address homeAddress;
@AttributeOverrides({
@AttributeOverride(name="city", column=@Column(name="company_city"))
@AttributeOverride(name="street", column=@Column(name="company_street"))
@AttributeOverride(name="zipcode", column=@Column(name="company_zipcode"))
})
@Embedded Address companyAddress;
}
Value 타입은 당연히 공유하면 안되지..
회원1의 주소랑 회원2의 주소를 공유하면 말이 안되니까..
불변 객체
Value 타입을 불변 객체로 만들어서 부작용을 사전에 차단하라고 한다..
Value 타입을 여러개 저장할 때는 컬렉션에 보관하고
@ElementCollection, @CollectionTable을 쓰면 된다고 함..
RDB의 테이블은 컬럼으로 컬렉션 못 씀.
그래서 별도의 테이블 만들어야 한다고 함.(@CollectionTable이 그 별도의 테이블 매핑을 담당)
@Entity
class Member{
...
@ElementCollection
@ColletionTable(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 List<Address> addressHistory = new ArrayList<>();
}
Value 타입은 식별자가 없어서 값을 변경하면 DB에서 원본 찾기 어렵다고 함..
특정 엔티티에 속한 Value 타입은 엔티티를 찾아서 변경하면 됨
Collection Value 타입이 문제라고 함..
Collection Value 타입에 변경이 생기면, 매핑된 테이블의 모든 연관된? 데이터를 삭제,
현재의 Collection Value 값들을 DB에 다시 저장한다고 함...
-> Collection Value 값들이 많으면 당연히 성능 문제가 생기겠지
모든 컬럼을 묶어서 기본 키를 구성해야 한다고 하네..?
그래서 모든 컬럼이 nullable = false..? 라고 함
(autoincrement id 가능한거 같은데..?)
embedded 타입이 엔티티를 참조할 수 있는데.. 참조 왜 함?
참조하면 무슨 일 일어나길래..
@AttributeOverride 쓸 일 있을까?
Value 타입을 불변으로 안 만들면 정말로.. 부작용이 잘 발생하나?
Collection value 타입 왜 씀?
영속성 전이, 고아 객체 제거 잘 모름
Value 타입은 equals(), hashCode()를 꼭 구현해야 한다??
Collection Value 타입과 일대다 관계 차이...
Collection Value 타입을 매핑한 테이블의 기본 키가 모든 컬럼을 묶은거라는데...
아닌거 같은데?