본문 바로가기

JPA

2월 3일 JPA 임베디드 타입class와 테이블을 매핑

임베디드를 사용해서 엔티티에 필드값을 할당하게 되면

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