@Getter
@Entity
@NoArgsConstructor
@Table(name = "MEMBER")
public class Member {
@Id
@Column(name="ID")
private String id;
@Column(name="NAME")
private String username;
private Integer age;
클래스와 테이블 매핑
Entity,table, colum이 매핑 정보이다.
JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다.
@Entity
이 클래스를 테이블이랑 매핑할거야! 라고 JPA에게 알림
@ Table
엔티티는 내가 지금 이 클래스를 이 테이블이랑 매핑할거야라고 알려준다면
테이블은 매핑할 테이블에 대한 정보를 알려준다.
이 어노테이션을 생략하면 클래스이름을 테이블 이름으로 매핑한다.
@Id
엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다.
⚠️ 기본키 매핑시
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
- LONG
- 아이디는 데이터 범위 넒게
- Wrapper(Long) 타입 쓰는 이유
-> nullable 하기 때문에 값이 없으면 null
0은 키값 0을 의미
@Colum
필드를 컬럼에 매핑한다.
데이터 베이스 스키마 자동생성을 사용해서 엔티티만 만들고, 테이블은 자동 생성이 되도록 해본다
@Id 어노테이션을 사용해서 기본키를 직접 할당했다.
그러면 직접 할당하지 않고 데이터베이스가 생성해주는 값을 사용하려면 어떻게 매핑해야 할까?
JPA에서 제공하는 데이터 베이스 기본 키 생성전략
1. 직접 할당 : @Id 사용
2. 자동 생성 : 대리 키 사용 방식
- IDENTITY : 기본 키 생성 → 데베에 위임
- SEQUENCE : 데베 시퀀스를 사용해서 기본 키 할당
- TABLE : 키 생성 테이블 사용
뭐야 종류가 왜이렇게 많아? 오라클,MYSQL 같은 데이터베이스 벤더마다 지원하는 방식이 다르기 때문이다.
직접 할당 전략
@Id로 매핑하기
Board board = new Board();
borad.setId("id1") // 기본키를 직접할당하였다.
em.persist(board);
IDENTITY 전략
기본 키 칼럼인 ID에 AUTO_INCREMENT를 추가하면 데이터 베이스에 값을 저장할 때, ID 컬럼을 비워두면 데베가 순서대로 값을 채워준다.
이 전략은 데이터베이스에 값을 저장하고 난 후에 기본 키 값을 구할 수 있을 때 사용한다.
이 전략을 사용하려면 GenerationType.IDENTITY로 지정하면 된다.
SEQUENCE 전략
유일한 값을 순서대로 생성하는 특별한 데베 OBJECT 이다.
시퀀스를 사용해서 기본 키를 생성한다.
@ENTITY
@SequenceGenerator(
name="BOARD_SEQ_GENERATOR",
// 식별자 생성기 이름
sequenceName="BOARD_SEQ",
// 데베에 등록되어 있는 시퀀스 이름
initialValue=1, allocationSize=1)
public class Board{
@Id
@GeneratedValue(strategey=GenerationType.SEQUENCE,
generator="BOARD_SEQ_GENERATOR")
private Long id;
1. 사용할 데베 시퀀스를 매핑
@SequenceGenerator를 사용하여 BOARD_SEQ_GENERATOR라는 시퀀스 생서기 등록
JPA는 이 생성기를 실제 데베의 BOARD_SEQ 시퀀스랑 매핑한다.
2.키 생성 전략 설정 및 생성기 선택
GenerationType.SEQUENCE로 생성 전략 설정
generator="BOARD_SEQ_GENERATOR"로 생성기 선택
id 식별자 값 ->위의 생성기가 할당
이 전략은 em.persist()를 호출 시,
1. 데베 시퀀스 사용하여 식별자 조회
2. 조회한 식별자 → 엔티티에 할당
3. 엔티티를 영속성 컨텍스트에 저장
4. 트랜잭션 커밋 → 엔티티를 데베에 저장
*IDENTITY 전략은 엔티티를 데베에 먼저저장 → 식별자 조회→식별자에 할당
TABLE 전략