JVM/JPA

임베디드 타입(복합 값 타입) @Embedded, @Embeddable

kyoulho 2023. 6. 24. 13:28

새로운 값 타입을 직접 정의해서 사용하는 것을 임베디드 타입이라고 한다

 

주의

임베디드 타입의 인스턴스를 여러 엔티티에서 공유하는 것은 데이터 무결성에 굉장히 치명적이다.

인스턴스를 복제해서 사용하거나 임베디드 타입에서 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;
}

'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