Entity
@Entity
@Table(name = "member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@Column(name = "name", length = 100)
private String name;
@Column(length = 100)
private String phone;
/* Getter, Setter */
}
- DB 테이블과 컬럼을 정의한 클래스
- 클래스에
@Entity
어노테이션을 붙여서 엔티티 객체임을 명시
- 테이블 이름을 바꾸고 싶으면
@Table(name = "테이블명")
을 통해 변경
Primary Key
- Primary Key 필드에
@Id
어노테이션을 붙여서 PK임을 명시
- 일반적으로
Long id;
필드 사용
- long이 아닌 Long인 이유: 값이 0인 경우, id가 없어서 0인지 실제 id 값인지 헷갈릴 수 있음
- 일반적으로 PK는 AUTO_INCREMENT 값이나 SEQUENCE 값 사용(유일하고 변경되지 않을 값)
- AUTO_INCREMENT:
@GeneratedValue(strategy = GenerationType.IDENTITY)
- SEQUENCE:
@GeneratedValue(strategy = GenerationType.SEQUENCE)
- DB마다 지원하는 예약어가 다르기 때문에 확인해서 사용
|
AUTO_INCREMENT |
SEQUENCE |
MySQL |
O |
X |
Oracle |
X |
O |
Column
- 컬럼 이름을 바꾸고 싶으면
@Column(name = "컬럼명")
을 통해 변경
@Column(length = 100)
등을 통해 길이 지정 가능
Sequence
@Entity
@SequenceGenerator(
name = "SEQ_GEN",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 50)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private Long id;
private String name;
}
name
: JPA SequenceGenerator 이름(컬럼 어노테이션 @GeneratedValue
의 generator에 설정)
sequenceName
: DB에 등록될 시퀀스 이름
initialValue
: 시퀀스 시작 값(SQL의 START WITH)
allocationSize
: 시퀀스 증가 값(SQL의 INCREMENT BY)
- JPA의 영속성 컨텍스트(1차 캐시)는 ID값이 필수인데, 매번 DB에 쿼리를 해서 ID 값을 받아오는 것은 굉장한 낭비이기 때문에 미리 50개씩 생성하고 메모리에 올려놓은 뒤 하나씩 가져다 사용한다
- 만약 기존의 회사 DB 시퀀스가 정책상 1개씩 증가하도록 설정되어 있다면
allocationSize
를 1로 설정한다