首页 > 解决方案 > java.sql.SQLException:字段“register_id”没有默认值

问题描述

我已经使用 spring boot 和 spring data jpa 编写了一个休息服务。将数据插入数据库时​​出现问题。我被搜查了,但没有弄清楚问题所在。

所以,我在 Mysql 中有一个名为user.

这是 DDL:

'id' INT NOT NULL AUTO_INCREMENT,
'registerId' INT NULL,
'genderId' INT NULL,
'cityId' INT NULL,
'firstName' VARCHAR(255) NULL,
'lastName' VARCHAR(255) NULL,
'username' VARCHAR(255) NULL,
'age' INT(2) NULL,
'email' VARCHAR(100) NULL,
'isNotificationAllowed' BIT(1) NULL,
'isBlocked' BIT(1) NULL,
'isActive' BIT(1) NULL,
'createdAt' TIMESTAMP NULL,
'updatedAt' TIMESTAMP NULL,

这是实体代表java项目中的那些列。

@Data
@Builder
@Entity
@Table(name = "user")
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private int id;

    @Column(name = "registerId", nullable = true)
    private int registerId;

    @Column(name = "genderId", nullable = true)
    private Integer genderId;

    @Column(name = "cityId", nullable = true)
    private Integer cityId;

    @Column(name = "firstName", nullable = true, length = 255)
    private String firstName;

    @Column(name = "lastName", nullable = true, length = 255)
    private String lastName;

    @Column(name = "username", nullable = true, length = 255)
    private String username;

    @Column(name = "age", nullable = true)
    private Integer age;

    @Column(name = "email", nullable = true, length = 100)
    private String email;

    @Column(name = "isNotificationAllowed", nullable = true)
    private boolean isNotificationAllowed;

    @Column(name = "isBlocked", nullable = true)
    private boolean isBlocked;

    @Column(name = "isActive", nullable = true)
    private boolean isActive;

    @Column(name = "createdAt", nullable = true)
    private Timestamp createdAt;

    @Column(name = "updatedAt", nullable = true)
    private Timestamp updatedAt;
}

所以,当我通过 Postman 运行服务时,它会在控制台上显示这样的 sql insert into user (age, city_id, created_at, email, first_name, gender_id, is_active, is_blocked, is_notification_allowed, last_name, register_id, updated_at, username, id)

当您发现实体名称与数据库中的列名称不同时。例如:cityId在我的 POJO 中转换city_id为 sql。所以,我搜索了它,发现@Column 注释中有一个错误。它没有像我们预期的那样工作。

请看:这是一个链接

所以,为了能够解决这个问题,我添加了

spring.jpa.hibernate.naming.implicit- 
strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

然后重新启动应用程序,似乎列映射已解决:

Hibernate: 
 insert 
 into
     user
     (age, cityId, createdAt, email, firstName, genderId, isActive, isBlocked, isNotificationAllowed, lastName, registerId, updatedAt, username, id) 
 values
     (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

但是在日志的末尾,会抛出一个错误。它说:

java.sql.SQLException: Field 'register_id' doesn't have a default value
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.17.jar:8.0.17]
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]
 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.17.jar:8.0.17]

我不明白这些领域的register_id出口在哪里。它不存在于数据库或实体中。

当我不在请求registerId中作为参数发送时,它会显示java.sql.SQLIntegrityConstraintViolationException: Column 'registerId' cannot be null. 也没有弄清楚那个消息。因为它在数据库中可以为空,并且在实体中定义为可以为空。

标签: javahibernatespring-bootspring-data-jpa

解决方案


问题是该registerId属性被定义为int,而不是Integer。适当的列可以null在数据库中,但该null值不能转换为int. 将其更改为Integer.


推荐阅读