임베디드를 사용해서 엔티티에 필드값을 할당하게 되면
DB에는 어떻게 넣어야 할까
테이블 구조
{Member (entity)}
-id : long
-name : String
-workPeriod : period
-homeAddress : address
{period (embedded) (valueType)}
-startDate : Date
-endDate : Date
{address (embadded) (valueType)}
-city : String
-street : String
-zipcode : String
DB 구조
{Member}
-ID(pk)
-name
-startDate
-endDate
-city
-street
-zipcode
DB에서는 임베디드 클래스의 필드들도 모두 컬럼으로 들어가게된다.
엠베디드를 쓴다고 하여 따로 값을 변경할 필요는 없지만
그러나 객체에서는 기능(메서드)가 있을수 있기때문에 각각 매핑해 주어야 한다.
DB에서는 모든 컬럼이 모여있는게 맞는데
자바에서 필드가 아래와 같다면
@Id @GenerateValue
@Column(name = "member_id")
private Long id;
@Column(name = "username")
private String username;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipcode;
위와같은 필드 구조라고 할때
LocalDateTime 타입은 startDate 와 endDate를 묶으려 한다
그럼 다음같이 변경해준다.
private LocalDateTime startDate;
private LocalDateTime endDate;
@Embadded //임베디드 클래스를 사용한다고 명시
private period workPeriod;
필드의 타입을 period로 설정해준다.
String 타입은 city , street , zipcode 역시
private String city;
private String street;
private String zipcode;
@Embadded
private Address homeAddress;
이족에도 타입을 임베디드 클래스명으로 설정해준다,
이제 임베디드 클래스를 만든다.
@Embaddable //임베디드 클래스 임들 선언
private class Address {
private String city();
private String street();
private String zipCode();
}
public Address(){} // 임베디드 클래스는 기본 생성자가 필수이다.
@Embaddable
private class period{
private LocalDateTime startTime;
private LocalDateTIme endTime;
}
public period(){}
'JPA' 카테고리의 다른 글
2월 3일 JPA 임베디드 속성의 재정의 (0) | 2023.02.03 |
---|---|
2월 3일 JPA 임베디드 클래스 실사용 (0) | 2023.02.03 |
2월 2일 JPA cascade 의 종류 (0) | 2023.02.03 |
2월 3일 JPA 임베디드 타입 (0) | 2023.02.03 |
2월 3일 JPA 값타입 (0) | 2023.02.03 |