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 를 지녀야 한다.
이것도 읽어보세요