객체와 테이블 매핑 어노테이션
@Entity
테이블과 매핑할 클래스는 어노테이션 필수
- 기본 생성자는필수
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
@Table
엔티티와 매핑할 테이블을 지정
속성
name | 매핑할 테이블 이름 |
catalog | catalog 기능이 있는 데이터베이스에서 catalog 매핑 |
schema | schema 기능이 있는 데이터베이스에서 schema 매핑 |
uniqueConstraints | DDL 생성 시에 유니크 제약조건을 만든다. |
[HBM2DDL] - 데이터베이스 스키마 자동 생성
<property name=”hibernate.hhm2ddl.auto” value=”create” />
애플리케이션 실행 시점에 테이블을 자동으로 생성
<property name=”hibernate.show_sql” value=”true” />
테이블 생성 DDL을 콘솔 출력
속성
create | 기존 테이블을 삭제하고 새로 생성. DROP + CREATE |
create-drop | create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다. DROP + CREATE + DROP |
update | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정 |
validate | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정은 DDL을 수정하지 않는다. |
none | 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2d이.auto 속성 자체를 삭제하거나 유효하지 않은 옵션 값을 주면 된다. |
HBM2DDL 주의사항
- 개발 초기 단계는 create 또는 update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI 서버는 create 또는 create-drop
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
<property name=”hibernate.ejb.naming_strategy” value=”org.hibernate.cfg.ImprovedNamingStrategy” />
<!--자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑-->
기본 키 매핑
- 직접 할당
- 자동 생성: 대리 키 사용 방식
- IDENTITY : 기본 키 생성을 데이터베이스에 위임 (주로 MySQL, PostgreSQL, SQL Server, DB2)
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당 (주로 오라클, PostgreSQL, DB2, H2)
- TABLE : 키 생성 테이블을 사용
- AUTO : 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택) @GeneratedValue(strategy = GenerationType.AUTO)
필드와 컬럼 매핑
@Column
객체 필드를 테이블 컬럼에 매핑 속성
name | 필드와 매핑할 테이블의 컬럼 이름 |
insertable | 기본값 true, 엔티티 저장 시 필드로 같이 저장 |
updatable | 기본값 true, 엔티티 수정 시 필드도 같이 수정 |
table | 하나의 엔티티를 두 개 이상의 데이틀에 매핑할 때 사용 |
nullable(DDL) | null 값의 허용 여부를 설정 |
unique(DDL) | @Table의 uniqueContraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용 |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용 |
precision, scale(DDL) | BigDecimal 타입에서 사용한다(BigInteger도 사용). Precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수. |
@Enumerated 자바의 enum 타입을 매핑할 때 사용한다.
@Temporal 날짜 타입을 매핑할 때 사용 TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑(예: 2013-10-11) TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑(예: 11:11:11) TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2013-10-11 11:11:11)
@Lob 데이터베이스 BLOB, CLOB 타입과 매핑
@Transient 이 필드는 매핑하지 않는다. 객체에 임시로 값을 보관하고 싶을 때 사용
@Access 필드 접근: AccessType.FIELD로 지정. 필드에 직접 접근 프로퍼티 접근 : AccessType.PROPERTY로 지정. 접근자Getter
출처 : 자바 ORM 표준 JPA 프로그래밍 김영한 지음