@Entity 가 붙은 클래스는 JPA 가 관리하게 된다.
주의 사항
기본 생성자는 필수 이다.(public or protected)
final class, enum, interface, inner 클래스 에는 사용 할 수 없다.
저장 할 필드에 final 사용해선 안된다.
자바의 경우 생성자를 하나 이상 만들 경우 기본 생성자를 만들지 않으므로 직접 만들어 줘야 한다.
//직접 만든 기본 생성자
public Member() {}
//임의의 생성자
public Member(String name) {
this.name = name
}
persistence.xml 속성
참고
@Column 매핑 정보의 nullable 속성을 false 지정 시 DDL 에 not null 제약조건 추가 가능
length 속성 이용 시 문자 크기 지정 할 수 있음
@Column(name = "NAME", nullable = false, length = 10)
//결과
create Table MEMBER {
...
NAME varchar(10) not null,
...
}
이런 기능들은 단지 DDL 을 자동 생성 할때만 사용되고 JPA 실행 로직에는 영향을 주지 않는다!
이 기능을 이용 시 개발자가 엔티티만 보고도 손쉽게 다양한 제약조건을 파악할 수 있는 장점이 있다
JPA가 제공 하는 데이터베이스 기본 키 생성 전략
키 생성 전략을 사용하려면 persistence.xml 에 hibernate.id.new_generator_mappings 속성을 반드시 추가 해야 함. JPA는 과거 버전과의 호환성을 위해 기본값을 false 로 설정 해두었음
직접 할당
@Id 로 매핑
@Id 적용 가능 한 자바 타입 목록
사용
Board board = new Board();
board.setId("id1") // 기본키 직접 할당
em.persist();
IDENTITY 전략
기본 키 생성을 데이터베이스에 위임 하는 전략 (Mysql, postgreSQL, SQLServer, DB2 에서 주로 사용)
JPA는 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회 하게 된다.
@Id
@GeneratedValue(strategy = Generation.Type.IDENTITY)
하이버네이트의 경우 JDBC3 에 추가된 Statement.getGeneratedKeys() 를 사용 해 데이터 저장과 동시에 생성된 기본 키 값을 얻어 올 수 있다. 즉, 하이버네이트는 이 메소드를 사용 해 데이터베이스와 한번만 통신한다.
IDENTITY 식별자 생성 전략은 엔티티를 데이터베이스에 저장 해야 식별자를 얻을 수 있으므로 em.persist() 호출 즉시 INSERT SQL이 데이터베이스에 전달 된다. → 쓰기지연 동작 하지 않음
SEQUENCE 전략
데이터베이스 시퀀스를 사용 해 기본 키를 생성 한다. ( 주로 오라클 ,PostgreSQL , DB2 , H2 에 사용 할 수 있다)
@SequenceGenerator(
name = "SOON_SEQ_GENERATOR",
sequenceName = "SOON_SEQ", //DB 시퀀스 이름
initialValue = 1, allocationSize = 1)
...
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "SOON_SEQ_GENERATOR")
private Long id;
...
// id 식별자 값은 SOON_SEQ_GENERATOR 시퀀스 생성기가 할당 한다.
내부 동작 방식
@SequenceGenerator
최적화 관련
Table 전략
키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략 (모든 데이터베이스에 적용 가능)
create table SOON_SEQUENCES {
sequence_name varchar(255) not null , // 시퀀스 이름
next_level bigint, // 넥.스트 레블~ (ㅈㅅ), 시퀀스 값
primary key (sequence_name)
}
@Entity
@TableGenerator(
name = "SOON_SEQ_GENERATOR",
table = "SOON_SEQUENCES",
pkColumnValue = "SOON_SEQ", allocationSize = 1)
...
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "SOON_SEQ_GENERATOR")
private Long id;
...
//SOON_SEQ 테이블 조회 결과
sequence_name | next_level
SOON_SEQ | 2
//SOON_SEQ 테이블에 값이 없으면 JPA 가 알아서 값을 insert 하면서 초기화 한다.
@TableGenerator
AUTO 전략
참고 사항