DDL을 애플리케이션 실행 시점에 자동 생성
데이터베이스 방언(Dialect)을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
생성된 DDL은 개발 환경에서만 사용
운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
제약 조건 추가, 유니크 제약조건 추가
ex) @Column(uniqe = true, length = 10)
DDL을 자동 생성할 때만 사용되고, JPA의 실행 로직에는 영향을 주지 않음
name : 필드와 매핑할 테이블의 컬럼 이름 (기본 값 : 객체의 필드 이름)
insertable, updatable : 등록, 변경 가능 여부 (기본값 : TRUE)
nullable(DDL) : null 값의 허용 여부를 설정 (false로 설정시 not null 제약 조건)
unique(DDL) : @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단한 유니크 제약조건을 걸 때 사용 (보통은 @Table에서 사용)
columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있음 ex) varchar(100) default 'EMPTY'
length(DDL) : 문장 길이 제약조건, String 타입에만 사용 (기본값 : 255)
precision, scale(DDL) : BigDecimal 타입에서 사용 (아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용, 기본값 : precision=19, scale=2)
-> precision : 소수점을 포함한 전체 자릿수
-> scale : 소수의 자리수
-> 참고: double, float 타입에는 적용되지 않음
value 속성
value
1. TemporalType.Date : 날짜, 데이터베이스 date 타입과 매핑(ex. 2022-07-28)
2. TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (ex. 23:22:22)
3. TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (ex. 2022-07-28 23:22:22)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@SequenceGenerator 속성
- name : 식별자 생성기 이름
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 시작하는 수를 지정
- allocationSize : 시퀀스 한 번 호출에 증가하는 수
(성능 최적화에 사용됨)- catalog, schema : 데이터베이스 catalog, schema 이름
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 1
)
class Member(
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
val id: Long = 0L,
@Column
var username: String
)
@TableGenerator 속성
- name : 식별자 생성기 이름
- table : 키 생성 테이블 명
- pkColumnName : 시퀀스 컬럼명
- valueColumnName : 시퀀스 값 컬럼 명
- pkColumnValue : 키로 사용할 값 이름
- initailValue : 초기 값, 마지막으로 생성된 값이 기준
- allocationSize : 시퀀스 한 번 호출에 증가하는 수
- catalog, schema : 데이터베이스 catalog, schema 이름
- uniqueConstraints(DDL) : 유니크 제약조건 지정
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ",
allocationSize = 1
)
class Member(
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
val id: Long = 0L
)