반응형
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다.
1. 객체와 테이블 매핑
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
1) @Entity
- @Entity가 붙은 클래스는 JPA가 관리하는 객체이며, 엔티티라고 함
- JPA를 사용해서 테이블과 매핑할 객체는 @Entity를 사용해야 함
- 기본 생성자 필수(파라미터가 없는 public OR protected로 생성자 구현 필요)
- final 클래스, enum, interface, inner 클래스 사용 X
- 객체의 필드에 final 사용 X
- 속성
- name
- JPA에서 사용할 엔티티의 이름을 지정
- 기본값 : 클래스 이름을 그대로 사용함
- name
2) @Table
- @Table은 엔티티와 매핑될 테이블(DB의 실제 테이블)을 지정함
- @Table 어노테이션이 없으면 클래스의 이름으로 된 테이블에 접근함
- 속성
- name
- DB의 테이블 이름을 지정
- name 속성을 사용하지 않으면 클래스 이름으로 된 테이블과 매핑
- catalog
- 데이터베이스 catalog 매핑
- shcema
- 데이터베이스 schema 매핑
- uniqueConstraints
- DDL 생성 시, 유니크 제약 조건 생성
- name
2. 데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동으로 생성시켜줌
- 이 방법으로 생성한 DDL은 개발 환경에서만 사용하는 것이 좋음 (운영에서 사용하게 될 경우 다듬어서 사용)
- 운영 DB에서는 절대 create, create-drop, update 사용 금지
1) hibernate.hbm2ddl.auto
META-INF/persistence.xml에 아래의 설정을 추가(value는 아래의 옵션에 맞게 설정하면 된다.)
<!-- DDL 자동 생성 관련 -->
<!--
create : 기존의 테이블을 삭제 후에 다시 생성 (DROP → CREATE)
create-drop : create와 같지만, 종료 시점에 테이블 DROP
update : 변경된 내용만 반영 (운영 DB에는 사용 X)
validate : 엔티티와 테이블이 정상적으로 매핑되었는 지 확인
none : 사용안함
-->
<property name="hibernate.hbm2ddl.auto" value="none" />
- @Column 어노테이션을 이용하여 해당 컬럼에 Unique, length, nullable 등 설정 가능
- 옵션
- create : 기존의 테이블을 삭제 후에 다시 생성 (DROP → CREATE)
- create-drop : create와 같지만, 종료 시점에 테이블 DROP
- update : 변경된 내용만 반영 (운영 DB에는 사용 X)
- validate : 엔티티와 테이블이 정상적으로 매핑되었는 지 확인
- none : 사용안함
3. 필드와 컬럼 매핑
- @Column : 컬럼 매핑
- @Temporal : 날짜 타입 매핑 (DATE : 날짜, TIME : 시각, TIMESTAMP : 날짜+시각)
- @Enumerated : enum 타입 매핑
- @Lob : BLOB, CLOB 매핑
- @Transient : 특정 필드를 컬럼에 매핑하지 않음(무시)
1) @Column : 컬럼 매핑 시 사용
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 지정 | 클래스의 필드 이름 |
insertable / updatable | 등록, 변경 가능 여부 지정 | TRUE |
nullable(DDL) | null 값의 허용 여부 설정 false : DDL 생성 시, not null 제약조건 추가 |
|
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용 @Table의 uniqueConstraints는 제약조건 이름을 설정할 수 있지만, unique 속성은 불가능 |
|
columnDefinition(DDL) | 데이터베이스의 컬럼 정보를 직접 줄 수 있음 | 필드의 자바타입과 방언정보를 사용 |
length(DDL) | 문자 길이 제약조건, String 타입에서만 사용 | 255 |
precision / scale(DDL) | BigDecimal(BigInteger) 타입에서 사용 precision: 소수점을 포함한 전체 자릿수 scale: 소수의 자릿수 double, float 타입에 적용 X 아주 큰 숫자 OR 정밀한 소수를 다루어야할 때만 사용 |
precision=19, scale=2 |
2) @Enumerated : Java enum 타입 매핑 시 사용
기본값이 EnumType.ORDINAL 이지만, EnumType.STRING으로 사용하는 것이 좋음
(나중에 enum 에 수정이 되는 경우 순서가 뒤죽박죽 될 수 있기 때문)
속성 | 설명 | 기본값 |
value | EnumType.ORDINAL : enum의 순서가 저장됨 EnumType.STRING : enum의 값이 저장됨 |
EnumType.ORDINAL |
3) @Enumerated : 날짜 타입(java.util.Date / java.util.Calendar) 매핑 시 사용
LocalDate / LocalDateTime 사용 시 생략 가능 (최신 하이버네이트에서 지원)
속성 | 설명 | 기본값 |
value | TemporalType.DATE : 날짜를 데이터베이스 date 타입과 매핑 (ex : 2022-04-13) TemporalType.TIME : 시간을 데이터베이스 time 타입과 매핑 (ex : 21:46:01) TemporalType.TIMESTAMP : 날짜와 시간을 데이터베이스 timestamp 타입과 매핑 (ex : 2022-04-13 21:46:01) |
4) @Lob : 데이터베이스의 BLOB / CLOB 타입과 매핑
- 속성이 없고, 알아서 BLOB과 CLOB으로 매핑
- 매핑하는 필드 타입이 문자면 CLOB으로 매핑, 나머지는 BLOB매핑
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
반응형
'BE > JPA' 카테고리의 다른 글
[JPA] 10. 연관관계 매핑 (0) | 2022.04.17 |
---|---|
[JPA] 9. 기본키 매핑 (0) | 2022.04.17 |
[JPA] 7. 플러시 & 준영속상태 (0) | 2022.04.13 |
[JPA] 6. 영속성 컨텍스트란? (0) | 2022.04.11 |
[JPA] 5. JPA에서 리스트를 조회해보자 (0) | 2022.04.05 |