본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JPA

값 타입 - 기본 값 타입, 임베디드 타입(3)

by 방구석 대학생 2020. 10. 21.

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

 

임베디드 타입과 연관관계?

JPA 표준 스펙에 나와있는 내용으로, PhoneNumber 와 같은 임베디드 타입이 PhoneEntity 와 같은 Entity 를 가질 수 있다.

즉, 임베디드 타입이 Entity 값을 가질 수 있다는 것이다.(Entity 자체의 외래 키 값만 가지고 있으면 되기 때문)

 

* 그런데 만약 한 Entity 안에서 같은 값 타입을 사용하면 어떻게 될까?

Member.java 안에 Address 타입의 객체를 2개 이상 선언하면?

-> 에러가 발생한다.(컬럼 명이 중복되기 때문이다. - Repeated column in mapping for entity)

 

이럴때 사용하는 것이 바로 @AttributeOverride 어노테이션 이다.

위의 어노테이션은 컬럼 명 속성을 재정의 한다.

- Member.java

@Embedded
private Address homeAddress;

@Embedded
@AttributeOverrides({@AttributeOverride(name = "city", column = @Column(name = "WORK_CITY")),
      @AttributeOverride(name = "street", column = @Column(name = "WORK_STREET")),
      @AttributeOverride(name = "zipcode", column = @Column(name = "WORK_ZIPCODE"))}) // DB 컬럼 명을 재정의 해준다.
private Address workAddress;

아래의 hibernate SQL 을 보면 정의한 컬럼 명 대로 테이블의 컬럼이 생성되었음을 알 수 있다.

- hibernate SQL

Hibernate: 
    
    create table Member (
       MEMBER_ID bigint not null,
        city varchar(255),
        street varchar(255),
        ZIPCODE varchar(255),
        USERNAME varchar(255),
        WORK_CITY varchar(255),
        WORK_STREET varchar(255),
        WORK_ZIPCODE varchar(255),
        endDate timestamp,
        startDate timestamp,
        TEAM_ID bigint,
        primary key (MEMBER_ID)
    )

 

* 참고 : 임베디드 타입 값이 null 이면 매핑한 컬럼 값은 모두 null 이 된다.

 

 

다음 글 에선 값 타입의 불변 객체에 대하여 알아보자.