@Getter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Bakeries extends BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "bakery_id")
private Long id;
}
}
기본키는 두가지로 나뉜다.
직접할당할거냐, 자동 생성할거냐.
기본키를 어플리케이션에서 직접 할당한다.
즉, 내가 직접 값 바인딩해서 jpa한테 넘겨야한다.
@Id
어노테이션만 붙이면 된다.
(1) 자바 기본형
(2) 자바 Wrapper형
(3) String
(4) java.util.Date
(5) java.sql.Date
(6) java.math.BigDecimal
(7) java.math.BigInteger
위의 경우에만 @Id 어노테이션이 적용 가능하다.
이건 기본키 생성을 DB에 위임한다.
DB가 알아서 생성한다.
굳이 내가 바인딩하지 않는다.
MySQL, PostgreSQL, SQL Server에서 주로 사용.
CREATE TABLE Board (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
...
)
인 DDL이라고 할 때,
DB에 레코드 저장 시 ID 칼럼을 비워두면 알아서 순서대로 채워준다.
이 경우에는
@GeneratedValue(Strategy = GenerationType.IDENTITY)
라고 기본키 필드 위에 붙인다.
가장 맨 위에 코드 있는 것처럼.
이 외에도 SEQUENCE전략, TABLE전략, AUTO 전략이 존재한다.
이렇게 다양한 이유는 DBMS마다 지원 방식이 다르기 때문.
오라클에서는 시퀀스가 존재하지만 MySQL에서는 없음.
MySQL에서 실제로 기본키는 AUTO_INCREMENT로 지정하는게 성능 측면에서는 바람직한 이유?
mysql DDL로 테이블 정의할 때 auto increment 설정하지 않고, JPA 넘기면 에러발생한다. (결국 Hibernate가 쿼리를 만들어내므로)
이때 쿼리문은 insert문에서 기본키를 뺀 쿼리가 만들어진다.