@Entity
, @Table
@Column
@Id
@ManyToOne
, @OneToMany
, @ManyToMany
위 애노테이션이 붙은 클래스는 JPA가 관리하는 엔티티
JPA를 통해 테이블과 매핑할 클래스에게 필수이다
@Entity
클래스는 기본생성자가 필수이다(리플렉션 때문)
final
, enum
, interface
, inner
클래스에 사용할 수 없다
데이터베이스 컬럼과 매핑될 필드에 final
사용할 수 없다
옵션 | 설명 |
---|---|
create | 기존 테이블 삭제 후 다시 생성 |
create-drop | create과 같으나 종료시점에 테이블 DROP |
update | 변경분만 반영, 컬럼을 삭제하지는 않는다 |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
운영 장비에는 절대 create, create-drop, update를 사용하면 안된다
개발 초기 단계는 로컬 DB에서 create 또는 update
테스트 서버는 update 또는 validate
스테이징과 운영 서버는 validate 또는 none
// null 불가, 길이 최대 10자 컬럼 설정
@Column(nullable = false, length = 10)
private String name;
@Table(uniqueConstrints = {
@UniqueConstraint(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"})
}
)
날짜 타입을 매핑한다
LocalDate, LocalDateTime을 사용하면 최신 하이버네이트가 지원하는 기능 덕분에 생략 가능하다
오라클 DB는 MySQL의 AUO INCREMENT와 비슷한 기능을 위해 시퀀스를 사용한다
MySQL의 AUTO INCREMENT 값은 삽입을 해야 생성되기 때문에, persist 호출에 insert 쿼리를 날리지만 SEQUENCE는 그렇지 않다
persist 호출 시에 (남은 키가 없다면) DB에서 가져오기만 하면된다
allocationSize를 통해 DB에서 한번에 가져올 SEQUENCE 값의 크기를 지정할 수 있다. 레코드를 생성할때마다 키 값을 위해 받아오는 것이 아니라, 한번에 여러개를 받아 모아놓고 사용하는 것이다
의외로 동시성 문제도 없어서 성능 최적화도하고 좋다고 한다