값타입
기본값 타입
- 자바 기본 데이터 타입
- 래퍼클래스
- String
임베디드 타입( 복합값 타입 )
- 객체 형태의 Data Type.
- @Embeddable : 값 타입을 지정하는 곳에 사용.
- @Embedded : 값 타입을 사용하는 곳에 사용.
- @AttributeOverride : 속성 재정의
- 장점
- 데이터의 의미 및 응집도를 높임.
- 재사용이 가능.
ex )
@Entity public class Member{ @Id @GetneratedValue private Long id; private String name; @Embedded //값 타입을 사용하는 곳 Period workPeriod; @Embedded //값 타입을 사용하는 곳 Address homeAddress; @Embedded //값 타입을 사용하는 곳 @AttributeOverrides({ @AttributeOverride(name="city", column=@Column(name="company_city")), //city 필드의 매핑 컬럼 재정의 @AttributeOverride(name="street", column=@Column(name="company_street")), //street 필드의 매핑 컬럼 재정의 @AttributeOverride(name="zipcode", column=@Column(name="company_zipcode")) //street 필드의 매핑 컬럼 재정의 }) // 속성 재정의 Address companyAddress; } @Embeedable // 값 타입을 지정하는 곳 public class Period{ @Temporal(TemporalType.DATE) Date startDate; @Temporal(TemporalType.DATE) Date endDate; } @Embeddable // 값 타입을 지정하는 곳 public class Address{ @Column private String city; @Column pivate String street; @Column private String zipcode; }
값 타입과 불변 객체
- 자바의 객체 공유시 발생되는 일반적인 문제와 같음. ( 메모리 참조주소만을 공유함으로써 같은 객체를 사용 )
- 해결책
- clone 메소드를 구현
- 생성자만을 이용한 값세팅이 되도록 객체를 구성 ( 불변객체 )
- Getter만 존재, Setter 메소드를 만들지 않아 값을 수정하지 못하도록 한다.
값 타입 컬렉션
- 값 타입을 하나이상 저장 하려 할때 사용.
- @ElementCollection, @CollectionTable 사용
- 특징
- 식별자가 없다
- 생명주기를 엔티티에 의존한다. ( 엔티티가 삭제되면 같이 삭제 된다. )
값 타입 컬렉션의 제약 사항
- 값 타입은 단순한 값들의 모음이므로 값의 변경이 생기면 원본 데이터를 찾기 어렵다.
- JPA 에서는 값의 변동 사항이 생길 시, 값 타입 컬렉션의 매핑된 데이터를 삭제하고 새로운 값을 모두 저장 한다.
@ElementCollection @CollectionTable(name="address_history", joinColumns = @JoinColumn(name="member_id")) private List<Address> AddressHistorys = new ArrayList<Address>();
코드를 추가시 address_history 테이블이 생성이 된다.
CREATE TABLE `address_history` ( `member_id` BIGINT(20) NOT NULL, `city` VARCHAR(100) NULL DEFAULT NULL, `street` VARCHAR(200) NULL DEFAULT NULL, `zipcode` VARCHAR(20) NULL DEFAULT NULL, INDEX `FK_2qc7mth9466r9vntt606n6p15` (`member_id`), CONSTRAINT `FK_2qc7mth9466r9vntt606n6p15` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) );
실무에서는 엔티티로 정의해 일대다 관계로 설정 후 영속성정의(Cascade), 고아 객체 제거(ORPHAN REMOVAL) 기능을 적용하여 값 타입 컬렉션처럼 이용할 수 잇다.
public class Member{
.
.
.
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="member_id")
private List<AddressHistory> AddressHistorys = new ArrayList<AddressHistory>();
.
.
.
}
@Entity
@Table(name="address_history")
public class AddressHistory {
@Id
@GeneratedValue
private Long id;
@Embedded
private Address address;
}
CREATE TABLE `address_history` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`city` VARCHAR(100) NULL DEFAULT NULL,
`street` VARCHAR(200) NULL DEFAULT NULL,
`zipcode` VARCHAR(20) NULL DEFAULT NULL,
`member_id` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `FK_518k2sayx1asmuw5soq8kcjao` (`member_id`),
CONSTRAINT `FK_518k2sayx1asmuw5soq8kcjao` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)
);