[JPA] @Embedded 와 @Embeddable

2021. 10. 8. 21:12개발공부/Java

728x90

@Embedded 와 @Embeddable

엔티티 여러 필드가 한 객체로 묶여서 관리할 경우 @Embeddable 클래스를 사용하고 엔티티에 @Embedded을 걸어줍니다.


@Entity
@Table(name = "PRODUCT")
public class Product {

    @Embedded
    private Address address;
    private int price;

}

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
@ToString
public class Address {

    @Builder
    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    private String city;

    private String street;

    private String zipcode;

}

Product의 주소필드가 city, street, zipcode로 구성될 때 Address 클래스를 Embeddable로 걸어 테이블을 생성하지 않고 객체로 다중필드를 엔티티에서 관리할 수 있습니다.

@Embeddable 어노테이션은 이 클래스가 엔티티들에 의해 embedded (포함된다)라고 선언해줍니다. 엔티티에선 @Embedded를 붙여준 필드는 다른 클래스에서 @Embaddable로 선언된 타입이 엔티티로 내장됩니다.

혹시나 엔티티와 엠베디드 클래스 내 필드명이 같은 변수가 있을 경우 엔티티의 엠베디드 필드에 @AttributeOverride를 사용해 name, column을 정해주면 됩니다.


@Embedded
@AttributeOverrides({
  @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
  @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
  @AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})
private ContactPerson contactPerson;

참고자료

'개발공부 > Java' 카테고리의 다른 글

[Java] main 메서드  (0) 2022.01.15
[Java] Mac class  (0) 2022.01.13
[Supplier] What is Java 8 Supplier interface?  (0) 2021.09.11
[Builder] 생성자 어노테이션  (0) 2021.09.05
[Java] Java Stream(스트림)  (0) 2021.09.03