@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String city; //시
private String district; //구
private String detail; //상세주소
private String zipCode; //우편번호
}
public class User {
...
@Embedded
private Address address;
....
}
Address를 @Embedded로 정의하고, @Embeddable로 사용한 경우, 칼럼에는 Address가 들어가는 것이 아니라, 해당 클래스가 가지고 있는변수들로 테이블 칼럼을 구성한다.
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column=@Column(name = "home_city")),
@AttributeOverride(name = "district", column=@Column(name = "home_district")),
@AttributeOverride(name = "detail", column=@Column(name = "home_detail")),
@AttributeOverride(name = "zipCode", column=@Column(name = "home_zip_code"))
})
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city", column=@Column(name = "company_city")),
@AttributeOverride(name = "district", column=@Column(name = "company_district")),
@AttributeOverride(name = "detail", column=@Column(name = "company_detail")),
@AttributeOverride(name = "zipCode", column=@Column(name = "company_zip_code"))
})
private Address companyAddress;
같은 임베디드 타입을 2개 이상 사용하고 싶다면, @AttributeOverrides를 이용한다. 칼럼 각각은 @AttributeOverride로 재정의 할 수 있다. name은 애플리케이션의 칼럼명이고 @Column의 name은 실제 db 테이블에서 사용하는 칼럼명이다.
Address 임베디드 타입 칼럼 4개가 2번 생성되어 총 8개의 칼럼이 추가되며, @Column에서 name으로 지정했던 값이 실제 DB 테이블의 칼럼명으로 생성되었다.
@Test
void embedTest() {
User user = new User();
user.setName("steve");
user.setHomeAddress(new Address("서울시", "강남구", "강남대로 마왕빌딩", "06241"));
user.setCompanyAddress(new Address("수원시", "장안구", "화성행궁", "281464"));
userRepository.save(user);
userRepository.findAll().forEach(System.out::println);
}
집주소를 homeAddress, 회사주소를 companyAddress로 설정했기 떄문에 각각 setHomeAddress와 setCompanyAddress로 주소를 설정할 수 있다.
@Embedded Javadoc을 확인하면, 어느 경우에 임베디드 타입을 사용하면 좋은지 예시가 나와있다.
참고로 , Example3 처럼, @Embeddable로 선언한 곳 안에서 @Embedded 사용이 가능하다.
반응형
'학습 > DB' 카테고리의 다른 글
영속성 컨텍스트로 발생하는 이슈 (0) | 2021.10.01 |
---|---|
Converter 사용하기 (0) | 2021.09.30 |
Native Query (0) | 2021.09.30 |
@Transactional (0) | 2021.09.26 |
고아제거 속성 알아보기 (0) | 2021.09.26 |