4 엔티티와 매핑
- 객체와 테이블 Mapping : @Entity, @Table
- 기본 키 Mapping : @Id
- 필드와 컬럼 Mapping : @Column
- 연관관계 Mapping : @ManyToOne, @JoinColumn
4.1 Entity
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션이 필수로 붙는다.
@Entity
가 붙는 클래스는 JPA가 자동으로 관리하게 된다.
@Entity
적용시 주의사항
기본 생성자
필수 생성
- JPA가 Entity 객체 생성시 기본 생성자를 사용하기 때문!
- final 클래스, enum, interface, inner class 에는 사용이 불가하다.
- 저장할 필드에 final 사용 불가
특징
- 생성자가 하나도 없으면 -> 기본 생성자를 자동적으로 만들어 준다.
- 별도로 생성자를 하나 이상 만들게 되면
JAVA
는 기본 생성자를 자동으로 만들지 않는다
- 이때는 직접
기본 생성자
를 만들어 주어야 한다!
4.2 Table
Entity와 매핑할 테이블을 지정한다. (이름 생략시 mapping한 entity 이름을 테이블로 사용!)
- Name : 매핑할 테이블 이름 설정
- Catalog : catalog 기능이 있는 DB에서 catalog를 매핑
- Schema : schema 기능이 있응 DB에서 schema를 매핑한다.
- uniqueConstraints :
DDL
생성시 유니크 제약조건을 만들어준다.
- 스키마 자동 생성 기능을 사용해서 DDL을 만들 떄만 사용
4.3 데이터베이스 스키마 자동 생성
JPA는 데이터베이스 Schema를 자동으로 생성하는 기능을 지원해준다.
어플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성!!
hibername.hbm2ddl.auto
속성
- create : 기존 테이블을 삭제하고 생성한다. (drop + create)
- create-drop : create 속성에 추가로 Application 종료할 때
DDL
을 제거해 준다. (drop + create + drop)
- update : DB 테이블과 엔티티 매핑 정보를 비교하여 변경 사항만 수정해준다.
- validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 해준다. (단순 비교만 한다.)
- none : 자동 생성 기능을 제공하지 않음!
주의 사항
- 개발 초기 단계 : create , update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버 : create, create-drop
- 테스트 서버 : update , validate
- staging과 운영 서버 : validate , none
4.4 기본 키(PK) 매핑
영속성 컨텍스트는 엔티티 식별자를 값으로 구분하므로 영속 상태로 만들기 위해 반드시 필요하다
기본키 생성 전략
직접
할당 : 기본 키를 어플리케이션이 직접 할당
자동
생성 : 대리 키 사용 방식
- IDENTITY : 기본 키 생성을 DB에 위임
- SEQUENCE : DB Sequence를 사용해서 기본 키를 할당
- TABLE : 키 생성 테이블을 사용한다.
- AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(DEFAULT 값이다)
기본키 생성 방법
- 기본 키를 직접 할당 :
@Id
만 사용
- 자동 생성 전략 사용 :
@GeneratedValue
추가 및 키 생성 전략 선택.
자연 키
- 비지니스에 의미가 있는 키
- 주민번호, 이메일, 전화번호
대리 키
- 비지니스와 관련 없는 임의로 마들어진 키,
대체 키
- 오라클 시퀀스, auto_increment, 키 생성 테이블
JPA는 모든 Entity에 일관된 방식으로 대리 키
사용을 권장한다.
4.5 필드와 컬럼 매핑 : 레퍼런스
Column : 객체 필드를 테이블 컬럼에 매핑
- name : 맵핑할 테이블의 컬럼 이름을 지정합니다;
- insertable : 엔티티 저장시 선언된 필드도 같이 저장합니다.
- updateable : 엔티티 수정시 이 필드를 함께 수정합니다.
- table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
- nullable(DDL) : NULL을 허용할지, 허용하지 않을지 결정합니다.
- unique(DDL) : 제약조건을 걸 때 사용합니다.
- columnDefinition(DDL) : DB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
- length(DDL) : varchar의 길이를 조정합니다.(String 타입만 가능)
기본값으로 255
가 입력됩니다.
- precsion, scale(DDL) : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미힌다.
Enumerated : JAVA의 ENUM 타입을 매핑할때 사용
- value(속성)
EnumType.ORDINAL
: ENUM 순서를 DB에 저장한다(Default 값)
EnumType.STRING
: ENUM의 이름을 DB에 저장한다.
Temporal : 날짜 타입을 매핑할때 사용
- 사용법 : @Temporal( 아래 값 )
- TemporalType.DATE : 날짜, 데이터베이스, date 타입과 매핑(예 : 2013-10-11)
- TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑(예 : 11:11:11)
- TemporalType.TIMESTAMP : 날짜와 시간, 뎅터베이스 timestamp 타입과 매핑(예 : 2013-10-11 11:11:11)
- TemporalType은 필수로 지정해야 한다.
LOB : DB의 BLOB, CLOB 타입과 매핑할때 사용
- value(속성)
- 지정된 속성이 없다. 대신에 매핑하는 필드 값이
문자
면 CLOB으로 매핑하고 나머지는 BLOB으로 매핑된다.
- CLOB : String, char[]
- BLOB : byte[]
Transient : 객체에 임시로 어떤 값을 보관하고 싶을때 사용
- 필드에 매핑되지 않는다.
- DB에 저장되지도 않고 조회하지도 않는다.
Access : JPA가 엔티티 데이터에 접근하는 방식을 지정
- field 접근 :
AccessType.FIELD
로 지정
- 필드에 직접 접근 -> private도 접근 가능
- property 접근 :
AccessType.PROPERTY
로 지정