이론서나 인강 모두 너무 래퍼런스의 느낌이 강해서 딱히 자세히 쓰지 않겠다.
그냥 내가 중요하다고 생각한 것들만 가져다 정리했다.
작성시에 유의할 점만 알자.
애플리케이션 실행 시점에 데이터베이스 DDL을 자동 생성해주는 기능을 제공한다.
persistence.xml 파일에서 아래 항목만 잘 수정하면 된다.
<property name="hibernate.hbm2ddl.auto" value="{여기에 아래 목록 중 하나 선택}">
<property name="hibernate.physical_naming_strategy" value="org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"/>
참고로 CamelCaseToUnderscoresNamingStrategy 전략은 스프링의
SpringPhysicalNamingStrategy
을 뱃겨온 것이다.릴리스 공지글에 나와 있다.
Column(nullable=false, length=10)
@Id
사용@Id
+ @GeneratedValue
AUTO_INCREMENT
와 동일AUTO
: DB 방언에 따라 자동으로 IDENTITY
, TABLE
, SEQUENCE
중 하나 사용IDENTITY
: 그냥 MySQL의 auto_increment
라고 생각하면 된다.SEQUENCE
: 시퀀스 사용TABLE
: 기본 키 생성용 테이블 사용엔티티 코드에서 딱히 뭔가를 설정하지 않아도 된다.
@Entity
@SequenceGenerator(
name = "member_seq_generator", // JPA 내에서만 사용할 시퀀스의 이름
sequenceName = "member_seq" // 실제 DB에 적용할 시퀀스 이름
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "member_seq_generator")
private String id;
// ... 생략
}
참고1.
@SequenceGenerator
를 사용하면allocationSize
가 기본으로50
임create seqeunce start with 1 increment 50
라고 생각하면 됨- allocationSize를 사용하면 매번 시퀀스 번호를 얻을 필요없이 미리 1~50까지 쌓아놓고 사용
- 50개를 다 쓰면 새롭게 51~100 까지 값을 읽어옴
참고2.
allocationSize 는 실제 Database 에서 생성한 increment 양과 똑같이 작성해야 에러가 안 생긴다.
반면에 initialValue 는 시퀀스 DDL 자동 생성시에만 쓰인다.
@Entity
@TableGenerator(
name = "SOME_SEQ_GENERATOR",
table = "TABLE_SEQUENCES",
pkColumnValue = "SOME_SEQ",
allocationSize = 1
)
public class SomeEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "SOME_SEQ_GENERATOR")
private Long id;
private String name;
private Integer age;
}
참고
매핑할 DDL, 테이블명 {table}
{pkColumnName} {valueColumnName} {pkColumnValue} {initialValue}
영속성 컨텍스트에 엔티티를 저장되기 위해서는 반드시 식별자 값(@Id
)가 반드시 필요하다.
그리고 [IDENTITY / SEQUENCE]
전략은 서로 다른 저장 방식을 갖는다.
지금부터 그 차이를 알아본다.
@Id
)로 사용ex: call next value for MEMBER_SEQ
참고
sequence 전략은 em.persist 하나당 2번 쿼리가 날라가는 것이 불만족스러울 수 있다.
하지만 이것은 allocationSize를 통해서 미리 값을 받아오면 해소가 된다.
참고로 사전에 미리 값을 올려두고 사용하기 여러 WAS가 있어도 동시성 문제는 없다