반응형

 

2022-02-16 17:45:16.979 ERROR 8720 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Field 'id' doesn't have a default value

java.sql.SQLException: Field 'id' doesn't have a default value

 

public void createUser(UserDto User) {
    User user = new User();
    user.setUserId(User.getUserId());
    user.setUserPassword(User.getUserPassword());
    user.setUserPhoneNumber(User.getUserPhoneNumber());
    userRepository.save(user);
}

mysql에 유저를 추가하는 코드인데 계속 에러가 나서 코드를 하나씩 지워가며 오류가 나는 부분을 찾았습니다.

userRepository.save(user);

유저 레포지토리에 세이브하는 코드인데 이 부분을 지우니 에러가 발생하지 않아 entity 작성이 잘못되었는지, DB랑 맞지 않는 부분이 있는지 계속 확인하였는데 그래도 해결되지 않았습니다.

 

그래서 구글링 하던 중 스택오버플로우에서 해당 오류에 대한 답을 찾을 수 있었습니다.

https://stackoverflow.com/questions/804514/hibernate-field-id-doesnt-have-a-default-value

"Sometimes changes made to the model or to the ORM may not reflect accurately on the database even after an execution of SchemaUpdate.

If the error actually seems to lack a sensible explanation, try recreating the database (or at least creating a new one) and scaffolding it with SchemaExport."

"경우에 따라 모델이나 ORM은 데이터베이스의 변경사항이 정확하게 반영되지 않을 수 있다.(SchemeUpdate) 코드 상의 오류를 정확히 파악할 수 없다면 다시 만들어보세요.(SchemeExport)"

Spring Boot 서버를 껐다가 켜면서 오류의 원인을 찾고 있었는데 생각해보니 MySQL을 재실행할 생각을 못해봤던 것 같습니다. (오류를 찾으면서 MySQL 유저 테이블의 데이터 타입이라던지 여러 가지 수정했었음......)

 

그러나 MySQL 재실행해도 그대로였고 그 밑에 기본키 생성에 관하여 언급이 많아 기본키를 살펴봤습니다.

@Id // PK를 뜻함
@GeneratedValue(strategy = GenerationType.IDENTITY)
// PK의 생성 전략을 설정
/*
 * GenerationType.IDENTITY : MySQL의 AUTO_INCREMENT 방식을 이용
 * GenerationType.AUTO(default) : JPA 구현체(Hibernate)가 생성 방식을 결정
 * GenerationType.SEQUENCE : DB의 SEQUENCE를 이용해서 키를 생성. @SequenceGenerator와 같이 사용
 * GenerationType.TABLE : 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
*/
@Column(name = "id", unique = true)
private Long id;

User entity에서 기본키 생성 전략은 

@GeneratedValue(strategy = GenerationType.IDENTITY)

을 사용했고 MySQL에서 기본키를 살펴보니

 

AI항목은 "Auto Increment" 항목인데 이 부분을 체크해주고 다시 실행해보니 잘 실행이 됩니다.

 

 

 

그리고 AI항목을 체크하지 않고 기본키 생성 전략을 IDENTITY에서 AUTO로 바꿔도 오류가 해결이 되었습니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(strategy = GenerationType.AUTO)

 

 

역시 코딩하다 막힐 때는 역시나 스택오버플로우입니다 👍

반응형

+ Recent posts