🤔현재 jpa와 mysql을 이용해서 프로젝트를 만들고 있는 데 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가 되면 확인하는 습관을 길러야 겠다는 생각을 하게 되었다.
참고 블로그: 기억보단 기록을;