JPA Chap4 엔티티 매핑
JPA를 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.
Jpa에서 엔티티 매핑은 크게 4가지로 분류 할 수 있다.
- 객체와 테이블 매핑 : @Entity, @Table
- 기본 키 매핑 : @Id
- 필드와 컬럼 매핑 : @Column
- 연관관계 매핑 : @ManyToOne, @JoinColumn
Chap4에서는 객체와 테이블 매핑, 기본키 매핑, 필드와 컬럼 매핑에 대해서 정리되어있다.
연관관계 매핑은 5,6,7장에 걸쳐서 정리되어 있음.
@Entity
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다.
- @Entity : JPA가 클래스를 관리하겠다고 하는 어노테이션
- name : JPA에서 사용할 엔티티 이름을 지정
(설정하지 않으면 클래스 이름 그대로 사용) - 주의사항
- 기본 생성자 필수(public, protected)
- final 클래스, enum, interface, inner 클래스 사용 불가
- 저장할 필드에 final 사용 불가
- name : JPA에서 사용할 엔티티 이름을 지정
@Table
엔티티와 매핑할 테이블을 지정한다.
- @Table : 엔티티와 매핑할 테이블을 지정
- name : 매핑할 테이블 이름(기본값 : 엔티티 이름 사용)
- catalog : catalog 기능이 있는 데이터베이스에서 catalog 매핑
- schema : schema 기능이 있는 데이터베이스에서 schema를 매핑
- uniqueConstraints : DDL 생성 시에 유니크 제약 조건 만듬.
데이터 스키마 자동 생성 -> DDL 제약조건 추가 -> 기본 키 매핑
일단 스키마, DDL에 대한 개념을 잡기 위해서 둘의 개념을 알아보도록 하자.
스키마 : Table의 집합. schema를 모은 것이 database Server
DDL(Data Definition Language) : 데이터 정의어. 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 데이터 구조와 관련된 명령어들을 말함.(CREATE, ALTER, DROP, RENAME, TRUNCATE)
<property name="hibernate.hbm2ddl.auto" value="create" />
// 애플리케이션 실행 시점에 데이터베이스 테이블을 자동 생성
<property name="hibernate.show_sql" value="true"/>
//테이블 생성 DDL을 출력
책에서 말하는 스키마 자동생성은 테이블 자동생성을 뜻하는듯하다.
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column(name =" Id")
private String id;
@Column(name = "NAME", nullable = false, length = 10) //추가
private String username;
}
perperty 생성과 함께 @Entity클래스를 생성하면 어플리케이션 실행 시 테이블이 자동으로 만들어진다.
이때 property를 이용하여 테이블의 생성 및 삭제 설정 및 camel표기법을 수정, 등의 기능을 사용할 수 있다.
@Table에 uniqueConstraints를 사용하여 유니크 제약 조건 또한 추가 할 수 있다.
##@Id
JPA에서는 기본키를 직접 할당할 수도 있고, MySQL에서 흔히 말하는 AI 기능을 통하여 생성된 값을 기본키로 할당할 수도 있다.
@Id = primary Key
JPA에서의 기본 키 생성 전략
직접 할당 : 기본키를 애플리케이션에서 직접 할당
- em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법
자동 생성 : 대리키 사용 방식
- IDENTITY : 기본키 생성을 데이터베이스에 위임
- MySQL, PostgreSQL, SQL Server, DB2 사용
- @GenerateValue(strategy = GenerationType.IDENTITY) 사용
- 데이터베이스에 엔티티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장 ( 데이터를 저장해야 식별자 값을 획득)
- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당
- Oracle, PostgreSQL, DB2, H2 사용
- @GenerateValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR"")
- @SequenceGenerator
- name : 식별자 생성기 이름(필수)
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용
- allocationSize : 시퀀스 호출당 증가하는 수 시퀀스값을 DB에서 가지고옴 50채울때까지 시퀀스 값을 안가지고옴.
- catalog. schema : 데이터베이스 catalog, schema 이름
- @SequenceGenerator
- 데이터베이스 시퀀스에서 식별자 값을 획득한 후 역속성 컨텍스트에 저장한다.
- TABLE : 키 생성 테이블 사용
- 모든 데이터베이스에 적용
- @TableGenerator
- name : 식별자 생성기 이름(필수)
- table : 키생성 테이블 명
- pkColumnName : 시퀀스 컬럼명
- pkColumnValue : 키로 사용할 값 이름(엔티티 이름)
- valueColumnName : 시퀀스 값 컬럼명
- initialValue : 초기 값, 마지막으로 생성된 값
- allocationSize
- catalog, schema
- uniqueConstraints(DDL) : 유니크 제약 조건 지정
- 값을 조회하면서 SELECT 쿼리를 사용하고 다음 값으로 증가시키기 위해 UPDATE 쿼리를 사용하기 떄문에 SEQUENCE 전략과 같다.
- 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득 한 후 영속성 컨텍스트에 저장한다.
- AUTO : 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동 선택
자동 생성 전략이 다양한 이유는 데이터베이스 밴더 마다 지원하는 방식이 다르기 때문이다.
권장하는 식별자 선택 전략
- null값은 허용하지 않는다.
- 유일해야 한다.
- 변해선 안된다.
- IDENTITY : 기본키 생성을 데이터베이스에 위임
필드와 컬럼 매핑: 레퍼런스
종류 : @Column, @Enumerated, @Temporal, @Lob, @Transient, @Access
JPA책 145Page 참고바람.
'JAVA > JPA' 카테고리의 다른 글
[chapter 5] JPA - 연관관계매핑기초 (0) | 2020.04.23 |
---|---|
[chapter 3] JPA - 영속성관리 (0) | 2020.04.15 |
[chapter 1] JPA 소개 (0) | 2020.04.13 |