Development Memories/JPA

【JPA】엔티티 매핑(Entity Mapping) - @Entity, @Table

친절한올드보이 2021. 5. 6. 19:05
반응형

객체와 테이블 맵핑을 담당하고 있는 @Entity 와 @Table 어노테이션에 대해서 공부한 내용을 정리해 봅니다.

(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)

 

@Entity

JPA에서 테이블과 매핑할 클래스에는 @Entity 어노테이션을 붙혀야 사용할수 있는데, 어노테이션을 사용하게 되면 JPA에서 자동 관리를 하게 됩니다.

 

속성

  • name : JPA에서 사용할 엔티티 이름 지정, 지정하지 않으면 클래스 명을 사용

사용상 주의 사항은 아래와 같습니다.

  1. 기본 생성자는 필수로 있어야 합니다.
    1. JPA에서 엔티티 객체를 생성할 때 기본 생성자를 사용하므로 반드시 존재해야 합니다. 그러나 자바는 생성자가 하나도 없으면 자동으로 생성하기 때문에 별도로 만들 필요는 없지만 기본적으로 숙지해 두면 좋을것 같습니다.
    2. 문제는 임의의 생성자를 하나 이상 만들게 되면 자바는 자동으로 생성자를 만들지 않기 때문에 주의가 필요합니다.
    3. (아래 코드 참조)
  2. final 클래스, enum, interface, inner 클래스에는 사용할 수 없습니다.
  3. 저장할 필드에는 final을 사용할 수 없습니다.
public Member(String name){
	this.name = name;
}

public Member() {} // 위에 임의로 만들었기 때문에 기본 생성자를 자동으로 생성하지 않음

 

 

@Table

엔티티와 매핑할 테이블을 지정 합니다. 생략하게 되면 매핑한 엔티티 이름을 테이블 이름으로 사용하게 됩니다.

 

속성

  • name : 매핑할 테이블 이름 지정, 지정하지 않으면 엔티티 명을 사용
  • catalog : catalog 기능이 있는 DB에서 지정한 catalog를 매핑하여 사용
  • schema : 스키마 기능이 있는 DB에서 schema 를 매핑해서 사용
  • uniqueConstraints(DDL) : DDL 생성시 유니크 제약 조건을 만듦, 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들때만 사용

매핑 예제

 

▶ 프리미티브 타입 과 String 타입등의 기본적인 타입의 매핑 예제

 

package sample.jpa;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

@Entity
@Table(name="table_alpha")
public class EntityAlpha implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="string_value")
    private String stringValue;

    @Column(name="boolean_value")
    private boolean booleanValue;

    @Column(name="int_value")
    private int intValue;

    @Column(name="double_value")
    private double doubleValue;

    @Column(name="big_integer_value")
    private BigInteger bigIntegerValue;

    @Column(name="big_decimal_value")
    private BigDecimal bigDecimalValue;

    @Column(name="date_value")
    @Temporal(TemporalType.DATE)
    private Date dateValue;

    @Column(name="datetime_value")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTimeValue;
}

 


 ENUM 타입의 매핍 예제

 

 

package sample.jpa;

public enum EnumAlpha {
    ALPHA,
    BETA,
    GAMMA,
}
package sample.jpa;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Entity
@Table(name="table_alpha")
public class EntityAlpha implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="ordinal_enum_value")
    private EnumAlpha ordinalEnumValue;

    @Column(name="string_enum_value")
    @Enumerated(EnumType.STRING) // name()이 리턴한 문자열로 저장
    private EnumAlpha stringEnumValue;
}

 LIST 타입의 매핑 예제(Sort 없음)

 

 

package sample.jpa;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name="table_alpha")
public class EntityAlpha implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(
        name="list_table",
        joinColumns=@JoinColumn(name="table_alpha_id")
    )
    @Column(name="value")
    private List<String> list;
}

 


 LIST 타입의 매핑 예제(DESC Sort)

 

 

package sample.jpa;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OrderBy;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name="table_alpha")
public class EntityAlpha implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(
        name="list_table",
        joinColumns=@JoinColumn(name="table_alpha_id")
    )
    @OrderBy("value DESC") //Hibernate는 value를 붙히지 않으면 에러가 발생합니다.
    @Column(name="value")
    private List<String> list;
}