4.1 @Entity
JPA를 사용해서 테이블과 매필할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다.
@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.
적용시 주의사항
- 기본생성자는 필수다(파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner클래스에는 사용할 수 없다,
- 지정할 필드에 final을 사용하면 안된다
속성 | 기능 | 기본값 |
name | JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. | 설정하지않으면 클래스 이름을 그대로 사용한다 |
4.2 @Table
엔티티와 매핑할 테이블을 지정한다.
속성 | 기능 | 기본값 |
name | 매핑할 테이블이름 | 엔티티 이름을 사용한다. |
catalog | catalog 기능이 있는 데이터베이스에서 catalog를 매핑 | |
schema | schema 기능이 있는 데이터베이스에서 schema를 매핑 | |
uniqueConstraints(DDL) | DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다. |
4.4 데이터베이스 스키마 자동 생성
JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. 클래스의 매핑정보를 보면 어떤 테이블에 어떤 컬럼을 사용하는지 알 수 있다.
<property name="hibernate.hbm2ddl.auto" value="create" />
이 속성을 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다.
hibernate.hbm2ddl.auto 속성
create | 기존 테이블을 삭제하고 새로 생성한다. |
create-drop | create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다. |
update | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다. |
validate | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지않는다. 이 설정은 DDL을 수정하지 않는다 |
none | 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto 속성 자체를 삭제하거나 유효하지 않은 옵션 none을 주면 된다. |
4.5 DDL 생성 기능
public class Member{
...
@Column(name="NAME",nullable = false, length = 10) // 추가
private String username;
...
}
- @Column 매핑정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약조건을 추가할 수 있다. 그리고 length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수있다.
- 이런 기능들은 단지 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
- 개발자가 엔티티만 보고도 손쉽게 다양한 제약 조건을 파악할 수 있는 장점이 있다.
4.6 기본 키 매핑
JPA가 제공하는 데이터베이스 기본 키 생성 전략
- 직접할당
- 자동생성: 대리 키 사용방식
- IDENTITY: 기본 키 생성을 데이터베이스에 위임한다.
- SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
- TABLE: 키 생성 테이블을 사용한다.
1) 기본 키 직접 할당 전략
- em.persist()로 엔티티를 지정하기 전에 애플리케이션에서 키본 키를 직접 할당하는 방법이다.
- 만약 식별자 값이 없으면 예외가 발생한다.
@Id
@Column(name="id")
private String id;
Board board = new Board();
board.setId("id1") // 기본 키 직접 할당
em.persist(board);
2) IDENTITY 전략
- 기본 키 생성을 데이터 베이스에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
- 데이터베이스에 엔티티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다. (IDENTITY 전략은 테이블에 데이터를 저장해야 식별자 값을 획득할 수 있다)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
2) SEQUENCE 전략
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다.
- SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성한다. 이 전략은 시퀀스를 지원하는 오라클, PostegreSQL, DB2, H2 데이터베이스에서 사용할 수 있다.
- 데이터 베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName= "BOARD_SEQ", // 매핑할 데이터베이스 시퀀스 이름
initialValue =1, allocationSize =1)
public class Board{
@Id
@GeneratedValue(starategy = 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"로 방금 등록한 시퀀스 생성기를 선택했다. 이제부터 id 식별자 값은 BOARD_SEQ_GENERATOR 시퀀스 생성기가 할당한다.
4) TABLE 전략
- TABLE 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.
- 데이터 베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
@Entity
@TableGenerator(
name = "BOARD_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnBalue = "BOARD_SEQ", allocationSize =1)
public class Board{
@Id
@GeneratedValue(starategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
@TableGenertor를 사용해서 테이블 키 생성기를 등록한다. 여기서는 BOARD_SEQ_GENERATOR라는 이름의 테이블 키 생성기를 등록하고 방금 생성한 MY_SEQUENCES 테이블 키 생성용 테이블로 매핑했다. 다음으로 TABLE 전략을 사용하기 위해 GenerationType.TABLE을 선택했다. 그리고 @GeneratedVlaue.generator에 방금 만든 테이블 키 생성기를 지정했다. 이제부터 id 식별자 값은 BOARD_SEQ_GENERATOR 테이블 키 생성기가 할당한다.
5) AUTO 전략
데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
예를 들어 오라클을 선택하면 SEQUENCE를, MySQL을 선택하면 IDENTITY를 사용한다.
'개발 도서 읽기 > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[5장]5.1~5.2 단방향 연관관계 (2) | 2024.11.11 |
---|---|
[4장] 4.7~4.8 엔티티 매핑 (1) | 2024.11.10 |
[3장] 영속성 관리 (0) | 2024.11.08 |
[2장] JPA 시작 (0) | 2024.11.07 |
[1장] 1.3 JPA란 무엇인가? (0) | 2024.11.06 |