객체와 테이블 매핑
@Entity
테이블과 매핑할 클래스에 필수로 붙이는 어노테이션이다
해당 어노테이션이 붙은 클래스는 JPA에서 관리하고 엔티티라고 부른다
속성
- name: JPA에서 사용한 엔티티의 이름을 지정한다 지정하지 않으면 클래스 이름 그대로 사용한다
주의할 점
- 기본 생성자는 필수이다 (public, protected)
- final, enum, interface, inner 클래스에는 사용할 수 없다
- 저장할 필드에 final을 사용하면 안된다
@Table
엔티티와 매핑할 테이블을 지정한다
해당 어노테이션을 생략하면 엔티티 이름을 매핑할 테이블 이름으로 사용한다
속성
- name: 매핑할 테이블 이름
- catalog: catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다
- schema: schema 기능이 있는 데이터베이스에서 schema를 매핑한다
데이터베이스 스키마 자동 생성
JPA는 클래스의 매핑정보를 통해 자동으로 데이터베이스 스키마를 생성하는 기능을 지원한다
<property name="hibernate.hbm2ddl.auto" value="create" />
속성
- create: 기존 테이블을 삭제하고 새로 생성한다
- create-drop: create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다
- update: 데이터베이스 테이블과 엔티티 매핑 정보를 비교해 변경 사항만 수정한다
- validate: 데이터베이스 테이블과 엔티티 매핑 정보를 비교해 차이가 있는 경우 경고를 남기고 애플리케이션을 실행하지 않는다
- none: 자동 생성 기능을 사용하지 않는다
-> DDL을 수정하는 create, create-drop, update 옵션은 개발 단계에서만 사용해야 한다
자바는 주로 카멜 표기법을 사용하고 데이터베이스는 언더스코어를 사용하는데 이름 매핑 전략을 변경해 자동으로 매핑할 수 있다
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
다양한 엔티티 매핑 어노테이션을 사용해서 DDL 생성 시 제약 조건을 추가할 수 있다
예로 들어, @Table의 uniqueConstraints 속성을 통해 유니크 제약 조건을 만들 수 있다
기본 키 매핑
기본 키 직접 할당 전략
기본 키를 애플리케이션에서 직접 할당한다
자동 생성 전략
1. IDENTITY 전략
기본 키 생성을 데이터베이스에 위임한다
엔티티를 데이터베이스에 저장한 후에 식별자를 조회해 엔티티의 식별자에 할당한다
- JPA는 엔티티의 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회한다
2. SEQUENCE 전략
데이터베이스 시퀀스를 사용해 기본 키를 할당한다
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다
데이터베이스에 시퀀스를 생성하고 엔티티에 사용할 데이터베이스 시퀀스를 매핑해야 한다
@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;
...
}
IDENTITY 전략과 다르게 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회해 엔티티에 할당한 후 엔티티를 영속성 컨텍스트에 저장한다
이후 플러시가 일어나면 데이터베이스에 저장된다
3. TABLE 전략
키 생성 전용 테이블을 만들고 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다
@Entity
@TableGenerator(
name="BOARD_SEQ_GENERATOR",
table="MY_SEQIENCES",
pkColumnValue="BOARD_SEQ", allocationSize=1) //테이블 키 생성기를 등록
public class Board {
@Id
@GeneratedValue(strategy=GenerationType.TABLE,
generator="BOARD_SEQ_GENERATOR") //테이블 키 생성기 할당
private Long id;
...
}
TABLE 전략은 시퀀스 대신 테이블을 사용한다는 것을 제외하고 SEQUENCE 전략과 내부 동작방식이 동일하다
4. AUTO 전략 (default)
어떤 데이터베이스를 사용하느냐에 따라 자동으로 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 선택한다
SEQUCNE나 TABLE 전략일 경우 시퀀스나 키 생성용 테이블을 미리 만들어 두어야 한다
'스터디 > JPA' 카테고리의 다른 글
연관관계 매핑 기초 - (1) (0) | 2025.02.09 |
---|---|
엔티티 매핑 - (2) (0) | 2025.02.08 |
영속성 관리 - (2) (0) | 2025.02.07 |
영속성 관리 - (1) (0) | 2025.02.07 |
JPA란 무엇인가? (1) | 2025.02.06 |