JPA Data Types

이 글에서는 JPA의 엔티티 타입과 값 타입(기본 값 타입, 임베디드 타입, 컬렉션 값 타입)에 대해 자세히 알아보고, 값 타입 비교 시 주의할 점을 설명합니다.

* JPA 의 데이터 타입 분류

1. Entity 타입

- @Entity 로 정의

- 데이터가 변해도 ID 값을 통해 추적 가능 

 

2. 값 타입 (Value)

- int, Integer, String 처럼 자바의 기본적인 타입

- 식별자가 없으므로, 변경시 추적할 수 없다.

 


* 값 타입의 분류

2.1. 기본 값 타입

-자바 기본 타입 (int, double)

-래퍼 클래스 (Integer, Long)

-String

 

2.2 임베디드 타입 **

-직접 타입을 선언해서 사용할 수 있다.

-기본 값 타입을 모아서 만들기 때문에, 복합 값 타입이라고 부른다. 

(ex : 주소 객체, 근무 기간 객체를 따로 만들어서 사용한다.)

 

Member.java

@Entity
@Table(name = "Member")
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String userName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;

    // @Embedded 어노테이션을 사용해야 한다.
    @Embedded
    private Period period;

    @Embedded
    private Address homeAddress;

}

Period.java

package hellojpa.entity;

import javax.persistence.Embeddable;
import java.time.LocalDateTime;

// @Embaddable 어노테이션을 표시해 주어야 JPA 가 정확히 이해한다.
@Embeddable
/*
 * Embedded Data Type 을 공유할 경우, 
 * 원하지 않게 다른 Row 들의 값들도 변경되는 Side Effect 들이 발생할 수 있다.
 * 이러한 경우를 막기 위해, 불변 객체를 만들어야 한다.
 * (생성자로만 값을 생성할 수 있고, Setter 메소드를 제공하지 않으면 된다.)
 */
public class Period {

    private LocalDateTime startDate;
    private LocalDateTime endDate;

    public LocalDateTime getStartDate() {
        return startDate;
    }

    public LocalDateTime getEndDate() {
        return endDate;
    }

}

 

Main Class

            Member member = new Member();
            member.setUserName("heejae");
            member.setHomeAddress(new Address());
            member.setPeriod(new Period());

            em.persist(member);

 

2.3 컬렉션 값 타입

-Java Collection 에 타입을 부여해서 사용할 수 있다.

 


 

값 타입의 비교

일반적인 자바 객체와 같이, 값 타입 안에 들어있는 Value 들이 같으면 같은 값으로 인식되어야 한다. (Override equals Method) hashcode() 메소드도 같이 구현해놓자. equals 에서 true  로 반환되는 두 객체는 같은 hashcode 를 지녀야 한다.

 

 


이것도 읽어보세요