본문 바로가기

공부/Jpa

04. 엔티티 매핑

4. 엔티티 매핑

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

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

1. @Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야함 @Entity가 붙는 클래스는 JPA가 관리하는 것으로, 엔티티라 부름

속성 정리

속성 기능 기본값
name JPA 에서 사용할 엔티티 이름을 지정함 설정하지 않으면 클래스 이름을 그대로 사용함

주의사항

  • 기본 생성자는 필수
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없음
  • 저장할 필드에 final을 사용하면 안됨

2. @Table

엔티티와 매핑할 테이블을 지정함. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용함

속성 정리

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용함
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑함
schema schema 기능이 있는 데이터베이스에서 schema를 매핑함
uniqueConstraints(DDL) DDL 생성 시에 유니크 제약조건을 만듬 (스키마 자동 생성 기능 사용하여 DDL 만들 때만 사용)

3. 다양한 메핑 사용

@Enumerated

자바의 enum 에 사용

@Temporal

자바의 날짜 타입에 사용

@Lob

길이 제한이 없음. 데이터베이스의 CLOB, BLOB 타입에 사용

4. 데이터베이스 스키마 자동 생성

5. DDL 생성 기능

6. 기본 키 매핑

기본 키(primary eky) 매핑

  • 직접 할당 : 기본 키를 애플리케이션에서 직접 할당
  • 자동 생성 : 대리 키 사용 방식
    • IDENTITY : 기본 키 생성을 데이터베이스에 위임
    • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당함
    • TABLE : 키 생성 테이블을 사용함

6.1. 기본 키 직접 할당 전략

@Id 을 사용

@Id
@Column(name = "id")
private String id;

@Id 적용 가능 타입

  • 자바 기본형
  • 자바 래퍼(Wrapper)형
  • String
  • java.util.Date
  • java.sql.Date
  • java.math.BigDecimal
  • java.math.BigInteger

기본 키 직접할당 전략은 em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법

Board board = new Board();
board.setId("01"); // 기본 키 직접 할당
em.persist(board);

6.2. IDENTITY 전략

기본 키 생성을 데이터베이스에 위임하는 전략. 주로 MySQL, PostgreSQL, SQL Server, DB2 에서 사용

ex) MySQL 의 AUTO_INCREMENT 기능

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

순서

  1. 먼저 엔티티를 데이터베이스에 저장한 후에 식별자를 조회해서 엔티티의 식별자를 할당함

6.3. SEQUENCE 전략

시퀀스를 사용해서 기본 키를 생성함. 시퀀스를 지원하는 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_TEST")
private Long id;

순서

  1. SEQUENCE 전략은 em.persist() 를 호출할 떄 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회함
  2. 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장함
  3. 트랜잭션을 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장함

@SequestGenerator

속성 기능 기본값
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
ititialValue DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정함 1
allocationSize 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) 50
catalog 데이터베이스 catalog, schema 이름

매핑 DDL

create sequence [sequenceName]
start with [ititialValue] increment by [allocationSize]

'공부 > Jpa' 카테고리의 다른 글

03. 영속성 관리  (0) 2019.02.10
01. Jpa 란?  (0) 2019.02.10