package hellojpa;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name = "member")//생략해도 됨
public class Member {
@Id
private Long id;
@Column(name = "name")
private String name;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
Hibernate:
drop table member if exists
Hibernate:
create table member (
id bigint not null,
age integer,
createdDate timestamp,
description clob,
lastModifiedDate timestamp,
name varchar(255),
roleType varchar(255),
primary key (id)
)
hibernate.hbm2ddl.auto
| 어노테이션 | 설명 |
|---|---|
| @Column | 컬럼 매핑 |
| @Temporal | 날짜 타입 매핑 |
| @Enumerated | enum 타입 매핑 |
| @Lob | BLOB, CLOB 매핑 |
| @Transient | 특정 필드를 컬럼에 매핑하지 않음(매핑 무시) |
| 속성 | 설명 | 기본값 |
|---|---|---|
| name | 필드와 매핑할 테이블의 컬럼 이름 | 객체 필드 이름 |
| insertable, | ||
| updatable | 등록, 변경 가능 여부 | TRUE |
| nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 | |
| not null 제약조건이 붙는다. | ||
| unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. @Table에서 선언하는 게 나음. | |
| columnDefinition | ||
| (DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. | |
| ex) varchar(100) default ‘EMPTY’ | 필드의 자바 타입과 방언 정보 | |
| length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
| precision, | ||
| scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). | |
| precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. | precision=19, | |
| scale=2 |
자바 enum 타입을 매핑할 때 사용
<aside>
⚠️ 주의! ORDINAL 사용 X
ORDINAL은 열거타입의 순서를 인식해서 저장을 하기 때문이다. 만약 추후에 운영 서비스에서 수정사항이 생겨 순서가 바뀌었을 때에도 기존에 저장된 순서를 그대로 따라가기 때문에 데이터베이스에 저장된 실제 데이터가 엉망으로 꼬이게 된다.
따라서 enum을 매핑할땐 반드시 @Enumerated(EnumType.STRING)을 쓰자
</aside>
| 속성 | 설명 | 기본값 |
|---|---|---|
| value | • EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 | |
| • EnumType.STRING: enum 이름을 데이터베이스에 저장 | EnumType.ORDINAL |
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
<aside> ⚠️
참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
</aside>