on
JPA 엔티티 매핑하기(@Entity)
JPA 엔티티 매핑하기(@Entity)
해당 클래스에 @Entity를 추가하면 해당 객체와 DB 테이블이 매핑된다.
우리는 이를 엔티티 클래스라고 한다.
@Entity와 @MappedSuperClass 가 있는데 두 가지에 대해서 간단히 알아보겠다.
@MappedSuperClass
가장 중요한 점은 @MappedSuperClass가 선언되어 있는 클래스는 엔티티가 아니다.
부모 클래스임을 지정하며 자식 클래스가 테이블로 생성할 때 부모 클래스의 변수는 자동적으로 자식 클래스의 필드에 생성된다.
상속 관계 매핑이 아니다.
직접 생성해서 사용할 일이 없으므로 추상 클래스로 만드는 것을 권장한다.
테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
@CreatedDate : 작성일
@LastModifyDate : 수정일
@Entity
객체를 테이블과 매핑할 엔티티라고 JPA에게 알려주는 역할을 한다.
즉, 엔티티 매핑을 한다고 알리는 애노테이션이다.
JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스를 상속할 수 있다.
기본 생성자가 존재해야 한다.
final class, inner class, enum, interface에는 사용할 수 없다.
필드에 final을 사용하면 안 된다.
기본 값으로 클래스 이름을 엔티티 이름으로 사용한다.
name : 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다.
@Table
엔티티 클래스에 매핑할 테이블명을 선언하기 위함이다.
@Id : PK를 설정하는 애노테이션이다.
@GenerateValue : 데이터 자동으로 증가
@Column
name : 필드와 매핑할 테이블의 컬럼 이름(기본값은 필드 이름)
nullable : null 값 허용 여부를 설정한다. 기본 값은 true이며, false인 경우 테이블 정의 시 필드에 Not Null 제약 조건이 붙는다.
length : 문자 제약 조건으로 기본 값을 255이며, String 타입에만 적용 가능하다.
@Temporal
TemporalType.DATE : 년-월-일의 date 타입
TemporalType.TIME : 시:분:초의 time 타입
TemporalType.TIMESTAMP : date + time의 timestamp(datetime) 타입 -> 방언에 의해 자동으로 작성
@Transient
@Transient 애노테이션이 있는 필드는 매핑이 이루어지지 않는다.
즉, DB에 저장하지 않고 조회하지도 않는다.
객체에 임시로 어떤 값을 보관하고 싶을 때 사용할 수 있다.
@Enumerated
자바의 enum 타입을 매핑할 때 사용한다.
EnumType.ORDINAL : 기본 값이며, enum의 순서를 DB에 저장(순서는 순서 변경에 따라 문제가 생길 수 있다.)
EnumType.STRING : 이름을 DB에 저장(권장)
임베디드 타입
@Embeddable : 값 타입을 정의하는 곳에 표시
@Embedded : 값 타입을 사용하는 곳에 표시
임베디드 타입은 엔티티의 값일 뿐이다.
임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함
연관관계 매핑
@ManyToOne : 테이블 매핑 시 N:1임을 명시
@ManyToMany : 테이블 매핑 시 N:N임을 명시
@OneToMany : 테이블 매핑 시 1:N임을 명시
@JoinTable : 애노테이션은 M:N 관계에서 생성할 테이블 명을 정의하는 애노테이션
@JoinColumn : 외래키를 매핑할 때 사용한다. name 속성에는 매핑할 외래키 이름을 지정한다.
from http://sweets1327.tistory.com/57 by ccl(A) rewrite - 2021-09-11 11:01:46