> For the complete documentation index, see [llms.txt](https://flamme1004.gitbook.io/flamme-dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://flamme1004.gitbook.io/flamme-dev/common/undefined-3/undefined-4/2020/jpa-study/chap4.md).

# Chap4

이 글은 김영한님의 jpa책을 보고 공부한 흔적입니다.

## JPA Chap4 엔티티 매핑

`JPA를 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.`

Jpa에서 엔티티 매핑은 크게 4가지로 분류 할 수 있다.

* 객체와 테이블 매핑 : @Entity, @Table
* 기본 키 매핑 : @Id
* 필드와 컬럼 매핑 : @Column
* 연관관계 매핑 : @ManyToOne, @JoinColumn

Chap4에서는 객체와 테이블 매핑, 기본키 매핑, 필드와 컬럼 매핑에 대해서 정리되어있다.

연관관계 매핑은 5,6,7장에 걸쳐서 정리되어 있음.

### @Entity

`JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다.`

* @Entity : JPA가 클래스를 관리하겠다고 하는 어노테이션
  * name : JPA에서 사용할 엔티티 이름을 지정&#x20;

    &#x20; (설정하지 않으면 클래스 이름 그대로 사용)
  * 주의사항&#x20;
    * 기본 생성자 필수(public, protected)
    * final 클래스, enum, interface, inner 클래스 사용 불가&#x20;
    * 저장할 필드에 final 사용 불가

### @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)

```java
<property name="hibernate.hbm2ddl.auto" value="create" />
// 애플리케이션 실행 시점에 데이터베이스 테이블을 자동 생성

<property name="hibernate.show_sql" value="true"/>
//테이블 생성 DDL을 출력
```

`책에서 말하는 스키마 자동생성은 테이블 자동생성을 뜻하는듯하다.`

```java
@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 이름
    * 데이터베이스 시퀀스에서 식별자 값을 획득한 후 역속성 컨텍스트에 저장한다.
  * TABLE : 키 생성 테이블 사용
    * 모든 데이터베이스에 적용
    * @TableGenerator
      * name : 식별자 생성기 이름(필수)
      * table : 키생성 테이블 명&#x20;
      * pkColumnName : 시퀀스 컬럼명
      * pkColumnValue : 키로 사용할 값 이름(엔티티 이름)
      * valueColumnName : 시퀀스 값 컬럼명
      * initialValue : 초기 값, 마지막으로 생성된 값
      * allocationSize
      * catalog, schema
      * uniqueConstraints(DDL) : 유니크 제약 조건 지정
    * 값을 조회하면서 SELECT 쿼리를 사용하고 다음 값으로 증가시키기 위해 UPDATE 쿼리를 사용하기 떄문에 SEQUENCE 전략과 같다.
    * 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득 한 후 영속성 컨텍스트에 저장한다.
  * AUTO : 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동 선택

  `자동 생성 전략이 다양한 이유는 데이터베이스 밴더 마다 지원하는 방식이 다르기 때문이다.`

  권장하는 식별자 선택 전략 1. null값은 허용하지 않는다. 2. 유일해야 한다. 3. 변해선 안된다.

### 필드와 컬럼 매핑: 레퍼런스

종류 : @Column, @Enumerated, @Temporal, @Lob, @Transient, @Access

JPA책 145Page 참고바람.

JAVA8부터는 LocalData가 있기 때문에 @Temporal 대신 쓴다.
