이 글은 김영한님의 JPA 강의 중 4장을 듣고 정리한 내용입니다 :)
강의 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
교재 : 자바 ORM 표준 JPA 프로그래밍🤷♀️
<property name="hibernate.hbm2ddl.auto" value="create"/>
- create : 삭제하고 다시 생성
- create-drop : 종료 시점에 drop
- update : 변경된 내용만 반영
- validate : 바꾸지는 않고, 엔티티-테이블이 정상 매핑되었는지 확인
- none : 아무것도 안함
- ??
@Column(unique = true, length = 10)으로 제약 조건 추가
JPA 실행 매커니즘에는 영향을 주지 않고 DB에만 영향을 줌, (DDL 생성 기능)
반면 @Table (name=" ")은 insert 쿼리에 영향을 줌
package hellojpa;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
@Entity
@Table (name="MBR") //DB에 매핑할 이름
public class Member {
@Id
private Long id;
@Column(name = "name") //DB에 표시되는 이름
private String username;
private Integer age; //알아서 디비 타입과 매핑
@Enumerated(EnumType.STRING) //DB에 ENUM타입 매핑 시
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) //DB에 날짜관련 매핑 시
private Date createdDate;
@Transient //DB에 넣지 않는 데이터
private int count;
@Lob //varchar보다 큰 타입을 넣고 싶은 경우
private String description; //문자면 CLOB, 나머지는 BLOB으로 매핑
//Getter, Setter…
}
→ 꼭 String 타입으로 저장
// EnumType.ORDINAL: enum 순서를 숫자로 데이터베이스에 저장
// EnumType.STRING: enum 이름을 데이터베이스에 저장
@Enumerated(EnumType.STRING) //DB에 ENUM타입 매핑 시
private RoleType roleType;
// 최신 버전
private LocalDate createdAt;
//구 버전
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
TemporalType.DATE: 날짜 (예시 2021-09-09, date)
TemporalType.TIME : 시간 (예시 11:11:11, time)
TemporalType.TIMESTAMP : 날짜, 시간 (예시 2021-09-09 11:11:11)
@Id
@GeneratedValue(strategy = GeneraionType.IDENTITY)
private Long id;
주민번호를 PK로 쓸 경우, 다른 테이블의 FK도 다 주민번호로...
→ DB 마이그레이션 할 때 불편함! → 테이블마다 주민번호를 다 넣어주고 바꿔야되기에
→ 비즈니스 관련 값 말고 그냥 랜덤 키값 Long으로 하기를 권장
(strategy = GeneraionType.AUTO) : DB 방언에 맞는 SQL 나옴 (오라클, h2, MySQL등 각각에 맞게)
(strategy = GeneraionType.SEQUENCE) : 그 다음 순서대로 자동 생성
⇒ ORACLE, @SequenceGenerator 필요
(strategy = GeneraionType.TABLE) : 키 생성 전용 테이블을 따로 만듦, 데이터베이스 시퀀스를 따라함 → 운영에서는 딱히 쓰지 않음
⇒ 모든 DB에서 가능, @TableGenerator 필요
(strategy = GeneraionType.IDENTITY) : 기본 키 생성을 DB한테 시킴
⇒ MySQL
다시 봐야함 - 4가지 방식
영속성 컨텍스트에 있으려면 PK값이 있어야되는데, PK를 자동생성으로 하면 디비에 들어가야 생성되므로 문제
→ Identity에서만
트랜잭션 커밋이 아니라, persist 할때 바로 insert 쿼리를 날림
em.persist할 때 → PK값을 만듦
시퀀스는 아이디값 생성 후,,,