새로운 값 타입을 직접 정의해서 사용하는 것을 임베디드 타입이라고 한다
주의
임베디드 타입의 인스턴스를 여러 엔티티에서 공유하는 것은 데이터 무결성에 굉장히 치명적이다.
인스턴스를 복제해서 사용하거나 임베디드 타입에서 setter를 없애자.
예제 코드
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@Embedded
Period workPeriod;
@Embedded
Address homeAddress;
@Embedded
@AttributeOverrides({ // 같은 타입을 사용할 경우 컬럼명을 재정의한다. 위치는 엔티티 필드에!!
@AttrbuteOverride(name="city", column=@Column(name = "COMPANY_CITY")),
@AttrbuteOverride(name="street", column=@Column(name = "COMPANY_STREET")),
@AttrbuteOverride(name="zipcode", column=@Column(name = "COMPANY_ZIPCODE"))
})
Address companyAddress;
@Embedded
PhoneNumber phoneNumber;
}
@Embeddable
@NoArgsConstructor // 기본 생성자가 필수다.
public class Period {
LocalDateTime startDate;
LocalDateTime endDate;
}
@Embeddable
@NoArgsConstructor
public class Address {
private String city;
private String street;
private String zipcode;
}
@Embeddable
@NoArgsConstructor
public class PhoneNumber {
private String areaCode;
private String localNumber;
@ManyToOne
private PhoneServiceProvider provider;
}
@Entity
public class PhoneServiceProvider{
@Id String name;
}
728x90
'JVM > JPA' 카테고리의 다른 글
JPQL 기초 (0) | 2023.06.25 |
---|---|
값 타입 컬렉션 @ElementCollection @CollictionTable (0) | 2023.06.25 |
영속성 전이, 고아 객체 (0) | 2023.06.23 |
즉시 로딩, 지연 로딩, 프록시 (0) | 2023.06.23 |
@SecondaryTable, @SecondaryTables (1) | 2023.06.19 |