@Enumerated 어노테이션

EnumType.STRING : enum 타입 값 이름을 저장

  • 문자열 타입 칼럼에 매핑
    EnumTyp.eORDINAL : enum 타입의 값의 순서를 저장
  • 숫자 타입 칼럼에 매핑
@Entity // 매핑 대상 엔티티
@Table(name = "hotel_info") // 테이블 이름에 해당하는 테이블과 매핑
public class Hotel{
	@Id // 식별자로 매핑
    @Column(name = "hotel_id") // 해당 이름의 칼럼에 매핑
    private String id;
    
    @Column(name = "nm") 
    private String name;
    
    private int year; // year 칼럼에 매핑
    
    @Enumerated(EnumType.STRING) // 열거타입 이름을 값으로 저장
    private Grade grade; 
    
    private LocalDateTime created;
    
    @Column(name = "modified")
    private LocalDateTime lastModified;

접근 타입

  • 두 개 접근 타입
    - 필드 접근 : 필드 값을 사용해서 매핑
    • 프로퍼티 접근 : getter/setter 메서드를 사용해서 매핑
  • 설정 방법
    -@Id 어노테이션을 필드에 붙이면 필드 접근
    -@Id 어노테이션을 getter 메서드에 붙이면 프로퍼티 접근
  • 주로 필드 접근을 선호, 불필요한 setter 메서드를 만들 필요가 없기 때문

식별자 생성 방법

직접 생성 방식

@Id 설정 대상에 직접 값 설정

  • 사용자가 입력한 값, 규칙에 따라 생성한 값 등
Hotel hotel = new Hotel("H-001", ...);
entityManager.persist(hotel);

식별 칼럼 방식

DB의 식별 칼럼에 매핑할 때 사용하는 방법
ex)
@GeneratedValue(strategy = GenerationType.IDENTITY) 설정

  • insert 쿼리를 실행해야 식별자를 알 수 있음
  • entityManager.persist() 호출 시점insert 쿼리가 실행
  • persist() 실행할 때 객체에 식별자 값이 할당

시퀀스 사용 방식

저장 시점에 시퀀스를 사용해서 식별자를 생성

  • 시퀀스를 사용해서 식별자 생성
    - JPA가 식별자 생성 처리 -> 객체 생성시에 식별값을 설정하지 않음
  • 설정 방식
    - @SequenceGenerator로 시퀀스 생성기 설정
    • @GeneratedValue의 generator로 시퀀스 생성기 지정
  • EntityManager persist() 호출 시점에 시퀀스 사용
    - persist() 실행할 때 객체에 식별자 값 할당됨
    • INSERT 쿼리는 실행하지 않음
@Id
@SequenceGenerator(
			name = "log_seq_gen",
            sequenceName = "activity_seq"
            schema = "crm",
            allocationSize = 1 // allocationSize를 1로 안 하면 여러 개의 시퀀스가 발생하는 문제 발생
)
@GeneratedValue(generator = "log_seq_gen")
// 생성 시점에 식별자 지정하지 않음
ActivityLog log = new ActivityLog("U01","VISIT");

// persist() 시점에 시퀀스로 식별자를 구함
em.persist(log);

// 커밋 시점에 INSERT 쿼리 실행
tx.commit();

테이블 사용 방식 -> 사용 빈도가 낮은 편

저장 시점에 테이블 사용해서 식별자를 생성

  • 테이블을 시퀀스처럼 사용
    - 테이블에 엔티티를 위한 키를 보관
    • 해당 테이블을 이용해서 다음 식별자 생성
  • 설정 방식
    - @TableGenerator로 테이블 생성기 설정
    • @GeneratedValue의 generator로 테이블 생성기 지정
profile
There are no two words in the English language more harmful than “good job”.

2개의 댓글

comment-user-thumbnail
2023년 3월 27일

@GeneratedValue(strategy = GenerationType.IDENTITY) 설정에 따라서 flush 시점이 달라집니다. 한번 이쪽 공부도 해보시는게 좋을거 같아요
jpa 전문가가 되기 위해 학습해 나가시는게 아주 멋집니다. querydsl도 깊게 학습해주세요!

1개의 답글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN