JPA

[JPA 3] JPA Entity

snowkit 2022. 2. 22. 14:51

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로 설정한다

'JPA' 카테고리의 다른 글

[JPA 6] 연관관계 - @ManyToOne  (0) 2022.03.10
[JPA 5] 영속성 컨텍스트  (0) 2022.02.22
[JPA 4] JPA 기본 사용법  (0) 2022.02.22
[JPA 2] JPA 설정  (0) 2022.02.22
[JPA 1] JPA란?  (0) 2022.02.22