【问题标题】:Spring boot error: NULL not allowed for column "ID" errorSpring引导错误:列“ID”错误不允许NULL
【发布时间】:2019-11-25 12:10:57
【问题描述】:

我在启动 Spring Boot 应用程序时不断收到此错误

Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
insert into bookings(bookings_name) values('Kris') [23502-199]

data.sql 有

insert into bookings(bookings_name) values('Kris');
insert into bookings(bookings_name) values('Martin');

而且我相信我有注释,所以@Id 会自动生成

@Entity
class Bookings {


    @Id
    @GeneratedValue
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;


    private String BookingsName;

    public Long  getId() {
        return id;
    }

    public String getBookingsName() {
        return BookingsName;
    }

    public Bookings(String BookingsName) {
        super();
        this.BookingsName = BookingsName;

    }


    @Override
    public String toString() {
        return "Bookings [id=" + id + ", BookingsName=" + BookingsName + "]";
    }

}

我刚刚开始学习 Spring boot,我在网上找到的每个示例似乎都无法转化为我在这里非常琐碎的示例。


完整的应用程序.java

import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


@Component
class BookingsCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {



    }

}




interface BookingsRepository extends JpaRepository<Bookings, Long> {

    Collection<Bookings> findByBookingsName(String BookingsName);

}


@RestController
class BookingsRestController {

    @Autowired
    BookingsRepository BookingsRepository;

    @RequestMapping("/Bookingss")
    Collection<Bookings> Bookingss() {
        return this.BookingsRepository.findAll();

    }

}


@Entity
class Bookings {


    @Id
    @GeneratedValue
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;


    private String BookingsName;

    public Long  getId() {
        return id;
    }

    public String getBookingsName() {
        return BookingsName;
    }

    public Bookings(String BookingsName) {
        super();
        this.BookingsName = BookingsName;

    }


    @Override
    public String toString() {
        return "Bookings [id=" + id + ", BookingsName=" + BookingsName + "]";
    }

}

【问题讨论】:

标签: java spring spring-boot spring-data-jpa


【解决方案1】:

您使用哪个数据库?我认为默认策略可能并不总是有效。
尝试在您的实体声明中使用不同的策略:

@Entity
class Bookings {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

【讨论】:

    【解决方案2】:

    我认为这里对 Spring/JPA 和 DBMS ID 生成存在混淆。将纯 SQL 运行到您的数据库(通过或不通过 Java 代码),例如硬编码“插入预订(预订名称)值('Kris');”不会关心被 @GeneratedValue 注释的实体的 Id 字段。

    要插入预订,您可以:

    • 使用JPA方式通过EntityManager插入数据
    • 配置您的 DBMS 架构以生成默认 ID
    • 在 SQL 的插入语句中使用 ID

    希望能帮到你,

    再见

    【讨论】:

      【解决方案3】:

      您需要更改您的数据库,以便 ID 列是标识/自动增量列,即该值将由 H2 管理,并且客户端不会为新记录指定值。

      完成此操作后,data.sql 中的记录应该可以毫无问题地加载。

      auto increment ID in H2 database

      对于 JPA 实体,您需要如下更新以告知您的 JPA 提供商 ID 由数据库管理:

      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "id", updatable = false, nullable = false)
      private Long id;
      

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 2022-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        相关资源
        最近更新 更多