초기 데이터를 구성하고 신규로 데이터 저장할 때 데이터 무결성 오류가 발생하였습니다.

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; 
constraint ["PRIMARY KEY ON PUBLIC.""DEPT””(deptId) ( /* key:1 */ CAST(1 AS BIGINT), NULL, NULL)"; 
SQL statement: insert into dept (deptId, deptName, remark) values (default, ?, ?) [23505-214]]; 
nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

 

1. 오류원인

h2 데이터베이스 2.xx 버전 사용하면서 초기 데이터를 구성 시 오류가 날 수 있습니다.

 

예를 들어

Application 최초 실행 시 data-h2.sql을 통해 부서 테이블에 초기 데이터를 적용하였습니다.

INSERT INTO dept (deptId, deptName, remark) VALUES(1, '전사', '');
구분 deptId deptName 비고
초기데이터 1 전사  
신규 저장 1 신규저장 키 중복오류 발생

h2 데이터베이스는 기본키 생성 방식 Default 설정이 SEQUENCE 전략입니다.

ddl-auto: create-drop 설정 적용 시, 시퀀스가 초기화되므로 Key가 1로 생성되어 중복키 오류가 발생합니다.


2. 해결책

h2 설정을 mysql모드로 변경해 주면 됩니다.

그럼 기본키 전략이 SEQUENCE에서 IDENTITY로 변경되며 Key 중복 오류가 발생하지 않습니다.

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:./test_db;MODE=MySQL
    username: sa
    password:
    
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create-drop

@GeneratedValue(strategy = GenerationType.IDENTITY)

 - 기본 키 생성을 데이터베이스에 위임

   (보통 id 값은 비워두고 자동으로 데이터베이스에서 자동으로 값을 입력)

 - 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용

 

@GeneratedValue(strategy = GenerationType.SEQUENCE)

 - 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트

 - 주로 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

 

읽어주셔서 감사합니다.

 

레퍼런스
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기