Embedded Type은 응집도를 높히기 위해 자바 기본값 타입들을 한데 묶어 사용자가 임의로 생성한 Type을 말한다.
Member.class
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String city;
private String street;
private String zipcode;
...
Member Entity에 주소 관련 컬럼이 위와 같이 정의되어있을 떄, Member가 주소관련 세부 상세 데이터들을 하나하나 관리하고 있는 것은 응집력을 떨어뜨린다. 이를 다음과 같이 변경할 수 있다.
Member.class
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Embedded
private Address address;
...
Address.class
@Embeddable
public class Address {
@Column(name="city") // 매핑할 컬럼 정의도 가능
private String city;
private String street;
private String zipcode;
...
정의된 타입을 사용해 응집도를 높혔을 뿐만 아니라, 재사용성도 높아졌다. 또한, 해당 값 타입만 사용하는 의미 있는 메소드를 만들어 사용할 수 있다.
@Embeddable
, @Embedded
둘 중 하나는 생략 가능 한 Entity 내에 Embedded Type을 중복으로 사용해 재정의가 필요하다면 @AttributeOverride
를 사용하면 된다
Member.class
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column = @Column(name = "COMPANY_CITY")),
@AttributeOverride(name="street", column = @Column(name = "COMPANY_STREET")),
@AttributeOverride(name="zipcode", column = @Column(name = "COMPANY_ZIPCODE")),
})
private Address companyAddress;
...
단순한 값 타입 하나 이상을 저장하는 기능을 지원하기 위해 @ElementCollection
과 @CollectionTable
이 존재한다.
Member.class
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@ElementCollection
@CollectionTable(name = "FAVORITE_FOODS", joinColumns =
@JoinColumn(name = "MEMBER_ID"))
@Column(name="FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<String>();
@ElementCollection
@CollectionTable(name = "ADDRESS", joinColumns =
@JoinColumn(name = "MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<Address>();
...
@CollectionTable
을 생략하면 기본값을 사용해 매핑한다.수정 사항 관련
ex)
addressHistory.remove(new Address("경기도", "기존 주소", "1234"));
addressHistory.add(new Address("경기도", "기존 주소", "1234"));
Entity
값 타입
참고 도서