簡體   English   中英

春季啟動錯誤:“ ID”列錯誤不允許為NULL

[英]Spring boot error: NULL not allowed for column “ID” error

我的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,在網上找到的每個示例似乎都無法轉化為我這里的瑣碎示例。


完整的應用程序

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 + "]";
    }

}

您使用哪個數據庫? 我認為默認策略可能並不總是有效。
嘗試在實體聲明中使用其他策略:

@Entity
class Bookings {

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

我認為關於Spring / JPA和DBMS ID的生成這里有一個困惑。 對純數據庫運行SQL(無論是否通過Java代碼),就像硬編碼的“插入預訂(bookings_name)值('Kris');”中一樣 不會在乎是否將實體的ID字段注釋為@GeneratedValue。

要插入預訂,您可以:

  • 使用JPA方法通過EntityManager插入數據
  • 配置您的DBMS模式以生成默認ID
  • 在SQL的插入語句中使用ID

希望能有所幫助,

再見

您需要更改數據庫,以便ID列是標識/自動遞增列,即,該值將由H2管理,並且客戶端將不會為新記錄指定值。

完成此操作后,就應該加載data.sql中的記錄,而不會出現任何問題。

H2數據庫中的自動增量ID

對於JPA實體,您需要進行以下更新以告知您的JPA提供者ID由數據庫管理:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM