준준의 기록일지

[오류해결] 데이터베이스에 'hibernate_sequence'(이)라는 개체가 이미 있습니다. 본문

스프링 에러

[오류해결] 데이터베이스에 'hibernate_sequence'(이)라는 개체가 이미 있습니다.

junjunwon 2021. 9. 27. 17:17

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




기본키 자동 생성 전략

- IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 방법 ( 데이터베이스에서 의존적)

  -> 주로 MySQL ,PostgresSQL, SQL Server , DB2에서 사용한다고 한다.

- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 ( 데이터베이스에 의존적 )

  -> 주로 Oracle, PostgreSQL, DB2, H2에서 사용

  -> @SequenceGenerator을 사용하여 시퀀스 생성기를 등록하고, 실제 데이터베이스에 생성될 시퀀스 이름을 지정해줘야 한다.

- TABLE : 키 생성 테이블을 사용하는 방법

  -> 키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만드는 방법이다.

  -> 테이블을 사용하므로 데이터베이스에 상관없이 모든 데이터베이스에 적용이 가능하다.

- AUTO : 데이터베이스에 의존하지 않고 기본키를 할당하는 방법

 --> 데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택해주는 방법.

  -> 데이터베이스를 변경해도 코드를 수정할 필요가 없다.

 

[문제점]

- DB에서 제공하는 auto_increment를 사용해서 테이블 전략 적용이 불가능하다.

- 내 생각에는 이때 우리 DB는 auto_increment를 지원하는데, GenrationType을 지정하지 않아서 default로 테이블에 기본키가 저장된거 같다.

그래서 발생한 에러가.

"데이터베이스에 'hibernate_sequence'(이)라는 개체가 이미 있습니다"

 

이 오류가 발생하게 된 이유는 아래와 같다.

 

Springboot의 변경사항

Spring Boot 2.0에서 spring.jpa.hibernate.use-new-id-generator-mappings의 default 값은 false입니다.

Spring Boot 1.5에서 spring.jpa.hibernate.use-new-id-generator-mappings의 default 값은 true입니다.

 

hibernate.id.new_generator_mappings = false일 경우

이 경우 사용하는 DB(Dialect)에 의해 Generator가 결정됩니다.

Dialect에서 supportsIdentityColumns()가 true 인 경우 IdentityGenerator를 사용하게 됩니다.

false 인 경우 SequenceStyleGenerator를 사용하게 됩니다.

hibernate.id.new_generator_mappings = true일 경우

이 경우 Sequence 기능을 지원하는 경우 SequenceGenerator를 사용하고,

Sequence 기능을 사용하지 않는 경우 TableGenerator를 사용합니다.

Hibernate의 변경사항

Hibernate 5부터 MSSQL에서의 GenerationType.AUTO는 IDENTITY가 아닌 TABLE을 기본 시퀀스 전략으로 사용합니다.

따라서 해결 방법은 application.properties에 아래 내용을 추가합니다.

spring.jpa.hibernate.use-new-id-generator-mappings=false

 

출처 : https://m.blog.naver.com/yjhyjh5369/222037560522