반응형
객체와 테이블 맵핑을 담당하고 있는 @Entity 와 @Table 어노테이션에 대해서 공부한 내용을 정리해 봅니다.
(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)
@Entity
JPA에서 테이블과 매핑할 클래스에는 @Entity 어노테이션을 붙혀야 사용할수 있는데, 어노테이션을 사용하게 되면 JPA에서 자동 관리를 하게 됩니다.
속성
- name : JPA에서 사용할 엔티티 이름 지정, 지정하지 않으면 클래스 명을 사용
사용상 주의 사항은 아래와 같습니다.
- 기본 생성자는 필수로 있어야 합니다.
- JPA에서 엔티티 객체를 생성할 때 기본 생성자를 사용하므로 반드시 존재해야 합니다. 그러나 자바는 생성자가 하나도 없으면 자동으로 생성하기 때문에 별도로 만들 필요는 없지만 기본적으로 숙지해 두면 좋을것 같습니다.
- 문제는 임의의 생성자를 하나 이상 만들게 되면 자바는 자동으로 생성자를 만들지 않기 때문에 주의가 필요합니다.
- (아래 코드 참조)
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없습니다.
- 저장할 필드에는 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;
}
'Development Memories > JPA' 카테고리의 다른 글
【JPA】기본 키(Primary Key) 매핑 정리 (0) | 2021.05.18 |
---|---|
【JPA】플러시(Flush) (0) | 2021.05.04 |
【JPA】Persistence Context(영속성 컨텍스트) 란 무엇인가? (0) | 2021.04.15 |
【JPA】Persistence.xml 설정 방법 (0) | 2021.04.11 |