4장. 엔티티 매핑 #
JPA 에서 지원하는 매핑 어노테이션은 크게 4가지로 분류할 수 있다.
설명 | 어노테이션 |
---|---|
객체 / 테이블 매핑 | @Entity , @Table |
Primary 키 매핑 | @Id |
필드 / 컬럼 매핑 | @Column |
연관관계 매핑 | @ManyToOne , @JoinColumn |
@Entity
#
테이블과 매핑할 클래스에 @Entity
어노테이션을 사용한다.
@Entity
가 붙은 클래스는 JPA 가 관리하는 것이며, 엔티티라 부른다.
주의사항
- 기본 생성자(Default Constructor, @NoArgsConstructor)는 필수
- final, enum, interface, inner 클래스에는 사용할 수 없다.
- 매핑할 필드(컬럼)에 final 값을 사용할 수 없다.
@Table
#
엔티티와 매핑할 테이블을 지정한다. (생략 시 엔티티 이름을 사용한다.)
@Id
#
@Id
적용 가능한 자바 타입은 다음과 같다.
- primitive type
- wrapper class type
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
* 개발자가 기본키를 직접 할당할 때에는 em.persist()
로 엔티티를 저장하기 전에 (아래와 같이)애플리케이션에서 단에서 기본키를 직접 할당해야한다.
Board board = new Board();
board.setId(1);
em.persist(board);
@Column
#
객체의 필드를 테이블의 컬럼에 매핑한다.
*
@Column
속성 중name
,nullable
이 주로 사용된다. (나머지는 자주 사용되지는 않는다고 한다.)
속성 | 기능 | 기본값 |
---|---|---|
name | 필드, 컬럼 매핑 시 사용되는 이름 | true |
insertable (거의사용되지않음) | false 일 경우, 이 필드는 저장하지 않는다. 읽기 전용일 때 사용하곤 한다. | true |
updatable (거의사용되지않음) | false 일 경우, 이 필드는 수정하지 않는다. 읽기 전용일 때 사용하곤 한다. | true |
table (거의사용되지않음) | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용한다. 지정한 필드를 다른 테이블에 매핑할 수 있다. | 현재 클래스가 매핑된 테이블 |
nullable(DDL) | null 제약, false 일 경우 not null 제약 | true |
unique(DDL) | 한 컬럼에 유니크 제약 조건 걸 수 있다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | |
length(DDL) | 문자 길이 제약조건 (String 타입에만 적용 가능) | 255 |
precision, scale(DDL) | BigDecimal(BigInteger)타입에서 사용할 수 있다. precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. double, float 타입에는 적용되지 않는다. 아주 큰 숫자, 정밀한 소수를 다룰 때 사용한다. | precision=19 scale=2 |
@Enumerated
#
enum 타입 매핑할 때 사용한다.
- ORDINAL
- STRING
@Temporal
#
날짜 타입(java.util.Date, java.util.Calendar) 매핑 시 사용한다.
- TemporalType.DATE : 날짜, DB의 date 타입과 매핑된다. (e.g. 2013-10-11)
- TemporalType.TIME : 시간, DB의 time 타입과 매핑된다. (e.g. 12:30:30)
- TemporalType.TIMESTAMP: 날짜와 시간, DB의 timestamp 타입과 매핑된다. (e.g. 2013-10-11 12:30:30)
예시는 다음과 같다.
@Temporal(TemporalType.DATE)
private Date date;
@Temporal(TemporalType.TIME)
private Date time;
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
@Lob
#
BLOB, CLOB 타입과 매핑한다.
- BLOB : byte[], java.sql.BLOB
- CLOB : String, char[], java.sql.CLOB
@Transient
#
매핑하지 않는다는 의미이다. DB에 저장하지 않고 조회하지 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Access
#
JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
- AccessType.FIELD : 필드 접근, 필드에 직접 접근한다. 필드 접근 권한이 private 여도 접근할 수 있다.
- AccessType.PROPERTY : 접근자(Getter)를 사용한다.