final
클래스, enum
, interface
, inner
클래스에는 사용 불가final
사용하면 안됨none
: 아무것도 실행하지 않음(default)create-drop
: SessionFactory가 시작될 때 drop 후 create를 실행하고, SessionFactory가 종료될 때 drop을 실행(in-memory DB의 경우 기본값)create
: SessionFactory가 시작될 때 데이터베이스 drop을 실행하고 create 실행update
: 변경된 스키마를 적용validate
: 변경된 스키마가 있다면 변경사항을 출력하고 애플리케이션을 종료@Table
의 uniqueConstraints
속성을 사용해 지정할 수 있다.@Table.uniqueConstraints
와 동일하지만 한 컬럼에만 제약조건을 걸 때 사용enum class
를 사용하려면 @Enumerated
어노테이션으로 매핑이 필요하다.EnumType.ORDINAL
: enum 순서를 데이터베이스에 저장 (default)EnumType.STRING
: enum 명을 데이터베이스에 저장(권장)java.util.Date
, java.util.Calendar
)을 매핑할 때 사용하며, 아래 TemporalType
은 필수로 지정해야한다.TemporalType.DATE
TemporalType.TIME
TemporalType.TIMESTAMP
INSERT
, UPDATE
등의 쿼리가 발생할 때, 현재 시간을 자동으로 저장해주는 @CreationTimestamp
와 @UpdateTimestamp
어노테이션을 제공.CLOB
, BLOB
타입 매핑시 @Lob
을 사용하면 된다.String
, char []
, java.sql.CLOB
byte[]
, java.sql.BLOB
mysql text 타입인 경우에는@Column(columnDefinition = "TEXT")
사용longtext의 경우@Lob
사용
AccessType.FIELD
: 필드에 직접 접근.AccessType.PROPERTY
: 접근자(getter)를 사용해 접근@Id
를 지정한 기준으로 설정된다.@Id
설정이 필요하다.@Id
로 설정된 값에는 null
값이 올 수 없다.@EmbeddedId
혹은 @IdClass
를 사용한다.@Id
annotation을 붙이면된다.entityManager.persist()
호출 전 애플리케이션에서 직접 식별자 값을 할당해야하며, 식별자 값 없이 저장하면 예외가 발생한다.@GeneratedValue
추가 후 원하는 키 생성 전략을 선택하면된다.IDENTITY
전략은 데이터베이스에 insert한 후에 기본 키 값을 조회할 수 있다.(데이터베이스에 Entity를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장) 하이버네이트의 경우는 JDBC3에서 제공하는 API의 Statement.getGeneratedKeys()
메서드를 사용하여 데이터를 저장함과 동시에 생성된 키값을 얻어온다. 이 경우에는 트랜잭션 쓰기 지연은 동작하지 않는다.@SequenceGenerator
를 사용해 시퀀스 생성기를 등록했으며, 등록한 시퀀스 생성기를 @GeneratedValue
의 generator로 생성한 시퀀스를 지정했다.hibernate_sequence
를 전역에서 사용한다.allocationSize
를 사용한다. allocationSize만큼 한 번에 시퀀스 값을 증가시키고, allocationSize만큼 메모리에 시퀀스 값을 할당한다. 이 최적화 방법은 시퀀스 값을 선점하므로, 여러 JVM이 동시에 동작해도 기본 키 값이 충돌하지 않는다. 단 allocationSize만큼 시퀀스 값이 증가하는 것은 유의해야한다.CUSTOM_SEQUENCES
키 생성용 테이블을 하나 만들어두고 그 테이블을 지정한 후 pkCloumnValue
로 시퀀스 값을 한개 생성하여 사용하는 것이다.next_val
이 증가하는 것을 볼 수 있다.@TableGenerator
GenerationType.AUTO
는 선택한 데이터베이스에 따라 위 3개 전략 중 하나를 자동으로 선택한다.equals()
와 hashCode()
를 구현해야한다.equals()
, hashCode()
를 구현해야한다.