jpa와 mysql 사용시 @GeneratedValue

greenTea·2023년 4월 26일
0

🤔현재 jpamysql을 이용해서 프로젝트를 만들고 있는 데 sql이 내 생각과 달라 당황하였다.

현재 entity를 보면 아래와 같다.


@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Entity
public class AnswerVoter extends BaseTime {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "site_user_id")
    private SiteUser siteUser;

    @ManyToOne(fetch = FetchType.LAZY)
    private Answer answer;
}

@GenerateValue를 직접 설정하지 않으면 (strategy = GenerationType.AUTO)가 설정 되어 자동으로 auto_increment로 될 줄 알았다. 그런데 실제 쿼리를 확인 해 보면 아래와 같은 쿼리가 날라간다.


    create table answer_seq (
       next_val bigint
    ) engine=InnoDB
Hibernate: 
    
    insert into answer_seq values ( 1 )
Hibernate: 

🤔 실제로 워크벤치를 확인 해본 결과 수많은 시퀀스 테이블이 생성되어 있었다. 그래서 이유를 찾아본 결과 기억보단 기록을님의 블로그에서 해답을 찾을 수 있었다.

버전이 바뀌면서 기본 생성 전략도 바뀌었다는 것인데 해결 방법은 yml파일로 글로벌 설정을 하는 방법과 직접 Identity로 바꾸는 방법이 있는데 여기서는 후자의 방법을 선택하였다.

아래와 같은 코드로 바꿔주고 다시 실행해보았다.

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Entity
public class AnswerVoter extends BaseTime {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "site_user_id")
    private SiteUser siteUser;

    @ManyToOne(fetch = FetchType.LAZY)
    private Answer answer;
}

😊이제는 시퀀스 테이블을 만들지 않고 생성한다.
항상 전략이 바뀔 수 있음에 주의하고 update가 되면 확인하는 습관을 길러야 겠다는 생각을 하게 되었다.

참고 블로그: 기억보단 기록을;

profile
greenTea입니다.

0개의 댓글

관련 채용 정보