기본값 타입
- 자바 기본타입 - int, double
- Wrapper 클래스 - Integer, Long
- String
생명주기를 엔티티에 의존하고
절대로 공유하면 안된다--> 다른 객체에서 값을 변경했는데 같이 변경될 수 잇음
임베디드 타입
새로운 값 타입을 정의하여 사용하는 것이다
C, C++에서 구조체를 정의하여 사용하는 것과 비슷하다고 생각된다
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Embedded
private Address address;
위 코드와 같이 임베디드 타입은 선언부에 @Embeddable
, 사용하는 곳에 @Embedded
을 표시해 주어야 사용이 가능하다
물론 둘중 하나만 표시를 해주면 사용이 가능하긴 하지만 임베디드 타입이라는 것을 어디서든 보고 알 수 있게 하기 위해서 둘다 명시해 주는 것이 좋다고 생각한다
때에 따라 하나의 임베디드 타입을 하나의 객체에서 여러개를 사용을 할 수 있다
그렇게 되면 테이블내 컬럼명이 중복이 되는데 그때는 직접 컬럼명을 재정의를 해주면 된다
@Embedded
private Address address;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column=@Column(name="HOME_CITY"),
@AttributeOverride(name="street", column=@Column(name="HOME_STREET"),
@AttributeOverride(name="zipcode", column=@Column(name="HOME_ZIPCODE"))
})
private Address homeAddress;
값 타입
값 타입을 비교할때 equals(), hashCode()를 재정의 해서 사용해야 한다
컬렉션
값 타입을 하나 이상 저장할 때 사용된다
컬렉션을 저장 하기 위한 별도의 테이블을 생성하여 해당테이블에 값을 입력한다
@ElementCollection
, @CollectionTable
을 사용하여 매핑한다
@ElementCollection
@CollectionTable(name="FOOD",
joinColumns=@JoinColumn(name="MEMBER_ID"))
private Set<String> foods = new HashSet<>();
@ElementCollection
@CollectionTable(name="ADDRESS",
joinColumns=@JoinColumn(name="MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<>();
값타입 제약사항
값타입은 수정시 약간의? 제약사항이 생긴다
값타입은 별도의 식별자라는 개념이 없어서 값을 변경을 해버리면 원본 데이터를 찾기에 어렵다
그래서 JPA는 값타입의 모든 값을 삭제하고 다시 변경된 값을 새로 입력을 해버리게 된다
데이터의 양이 적을 때에는 아무런 문제가 되지 않을 수 도 있지만 양이 많아진다면 그만큼 쿼리가 실행되고 시간의 지연이 생길 것이다
이는 차라리 일대다 매핑으로 새로운 테이블을 만들어서 푸는 것이 좋다
참고
자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한 님 강의
https://www.inflearn.com/course/ORM-JPA-Basic
책 - 자바 ORM 표준 JPA 프로그래밍
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
'공부기록 > JPA' 카테고리의 다른 글
JPA- JPQL (0) | 2022.01.31 |
---|---|
JPA-JPQL (0) | 2022.01.28 |
JPA-프록시 (0) | 2022.01.26 |
JPA-고급매핑2 (0) | 2022.01.20 |
JPA 고급매핑1 (0) | 2022.01.20 |