@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
private String zipcode;
private String address;
private String subAddress;
}
간단한 Member 엔티티를 만들어 보았다. 여기서 아래의 3개 필드는 멤버의 주소이다.
이렇게 구현할 때의 문제점은 필드가 추가될 때 지저분해지며 가독성이 떨어지게 된다.
3개의 주소 필드를 Address 라는 클래스 하나로 묶어준다면 어떨까
@Embeddable
public class Address {
private String zipcode;
private String address;
private String subAddress;
}
Address 클래스에 @Embeddable 어노테이션을 달아준다
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
// private String zipcode;
// private String address;
// private String subAddress;
@Embedded
private Address address;
}
기존 엔티티 객체로 묶을 필드에 @Embedded 어노테이션을 달아준다
@Embedded 로 클래스를 컬럼으로 받을 때 여러번 받고 싶을 수도 있다.
하지만 컬럼이름이 중복이 될것이다. 이럴 때 @AttributeOverride 로 컬럼네임을 커스텀 할 수 있다.
// 중복 테스트
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@Embedded
private Address address;
@Embedded
private Address parentAddress;
}
동일한 임베디드 선언으로 중복 컬럼 에러 발생
// 컬럼 네임 커스텀
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@Embedded
@AttributeOverride(name = "zipCode", column = @Column(name = "MY_ZIP_CODE"))
@AttributeOverride(name = "address", column = @Column(name = "MY_ADDRESS"))
@AttributeOverride(name = "subAddress", column = @Column(name = "MY_SUB_ADDRESS"))
private Address address;
@Embedded
@AttributeOverride(name = "zipCode", column = @Column(name = "PARENT_ZIP_CODE"))
@AttributeOverride(name = "address", column = @Column(name = "PARENT_ADDRESS"))
@AttributeOverride(name = "subAddress", column = @Column(name = "PARENT_SUB_ADDRESS"))
private Address parentAddress;
}
만약 @Embbeded 한 컬럼이 콜렉션이면 어떻게 해야할까?
임베디드 타입은 컨테이너가 되어선 안된다고 나온다.
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@ElementCollection
private List<Address> addresses;
}
@ElementCollection 만 붙혀주면 매핑이 된다. Member 테이블에 Collection 컬럼이 추가 되는 것이 아니라
새로운 테이블이 생성이 된다.