JAP 사용시 가장 중요한 일은 엔티티와 테이블의 정확한 매핑이다. 따라서 매핑 어노테이션을 반드시 숙지하고 있어야 한다.
■ 대표 어노테이션
- 객체와 테이블 매핑 : @Entity, @Table
- 기본 키 매핑 : @Id
- 필드와 컬럼 매핑 : @Column
- 연관관계 매핑 : @ManyToOne, @JoinColumn
■ Entity
JAP를 사용해서 테이블과 매핑할 클레스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스는 JAP가 관리하는 것으로, 엔티티라 부른다.
속성 | 기능 |
name | JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 다른패키지에 같은 엔티티 이름이 지정되지 않도록 해야한다. 설정하지 않으면 클래스 이름을 그대로 사용한다. ex) Member |
@Entity 적용시의 주의 사항은 아래와 같다.
- 기본생성자는 필수 (파라미터가 없는 public 또는 protected)
- final, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안된다.
- 기본생성자는 반드시 있어야 한다. ex) public Member() {} // 기본생성자
■ Table
@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
속성 | 기능 |
name | 매핑할 테이블 이름. 없을시 엔티티 이름을 사용한다. |
catalog | catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다. |
schema | schema 기능이 있는 데이터베이스에서 schema를 매핑한다. |
uniqueConstraints (DDL) | DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 생성 가능하다. 해당 기능은 스키마 자동생성 기능을 사용해서 DDL을 만들시에만 사용한다. |
■ 기본키 할당 전략
기본키 직접 할당 전략은 em.persist() 로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법이다.
기본키를 직접 할당하기 위해서는 @Id 로 매핑하면 된다.
@Id @Column(name = "id") private String id;
@Id 적용 가능 자바 타입은 다음과 같다.
- 자바 기본형
- 자바 래퍼(Wrapper) 형
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
1. IDENTITY 전략
IDENTITY 는 기본 키 생성을 데이터베이스에 위임하는전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. 데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.
사용하기 위해서는 @Id 어노테이션에 @GeneratedValue 어노테이션을 사용하고 식별자 생성 전략을 선택해야 한다.
IDENTITY 전략을 사용하기 위해서는 strategy 속성 값을 GenerationType.IDENTITY 로 지정하면 된다.
@Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... }
2. SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다. SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성한다. 주로 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용할 수 있다. 시퀀스는 미리 생성해두어야 한다.
@Entity @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "BOARD_SEQ", // 매핑할 데이터베이스 시퀀스 이름 initialValue = 1, allocationSize = 1) public class Board { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR") private Long id; ... }
@SequenceGenerator 를 사용해서 BOARD_SEQ_GENERATOR라는 시퀀스 생성기를 등록한다. 그리고 sequenceName 속성의 이름으로 BOARD_SEQ 를 지정했는데 JPA는 이 시퀀스 생성기를 실제 데이터베이스의 BOARD_SEQ 시퀀스와 매핑한다. 또한 키전략을 GenerationType.SEQUENCE로 설정하고 generator = "BOARD_SEQ_GENERATOR" 로 방금 등록한 시퀀스를 선택한다.
- @SequenceGenerator 속성
속성 | 기능 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initalValue | DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. | 1 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 |
'develop > JPA, Hibernate' 카테고리의 다른 글
엔티티 매니저 등록/수정/삭제/조회 정리 (0) | 2019.11.24 |
---|---|
엔티티 매니저 설정, 생성과정 (0) | 2019.11.24 |
데이터베이스 방언 (0) | 2019.10.19 |
JPQL 이란? (querydsl) (0) | 2019.10.12 |
Hibernate 란? (0) | 2019.09.30 |