Spring Boot and H2 Table Population Error: org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

Spring Boot and H2 Table Population Error: org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

我无法填充内存中的 H2 数据库。这里的想法是将唯一的 BuildingCode 作为主键和 ID。

我收到以下 class 级错误:

org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 JDBC声明

原因:org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:列“BUILDING_CODE”不允许为 NULL; SQL 声明:

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "Property")
public class Property {

    @Id
    @Column(name = "BuildingCode")
    String id;

    @Column(name = "Latitude")
    Float latitude;

    @Column(name = "Longitude")
    Float longitude;

    @Column(name = "BuildingName")
    String buildingName;

    @Column(name = "BuildAbr")
    String buildAbr;

    @Column(name = "Address")
    String address;

    @Column(name = "SquareFt")
    Long squareFt;

    @Column(name = "AssetId")
    Long assetId;

    public String getLatLong(){
        return "[" + this.getLatitude() + "," + this.getLongitude() + "]";
    }
}

Table 创建和示例插入

CREATE TABLE Property(
   Latitude       NUMERIC(9,6) NOT NULL
  ,Longitude      NUMERIC(10,6) NOT NULL
  ,BuildingCode   VARCHAR(5) NOT NULL PRIMARY KEY
  ,BuildingName   VARCHAR(42) NOT NULL
  ,BuildAbr       VARCHAR(18) NOT NULL
  ,Address        VARCHAR(42) NOT NULL
  ,SquareFt       INTEGER
  ,AssetId        INTEGER
);

INSERT INTO Property(Latitude,Longitude,BuildingCode,BuildingName,BuildAbr,Address,SquareFt,AssetId) VALUES (43.453696,-76.544895,'0006','Lanigan Hall','LANIGAN-6','some address',88200,1743);

还有我的application.properties

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url = jdbc:h2:mem:testdb:DB_CLOSE_ON_EXIT=FALSE

spring.jpa.show-sql=false
spring.jpa.properties.hibernate.generate_statistics=false
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

在实体 class 中,您定义了驼峰式的列名称,即 BuildingCode,

@Id
@Column(name = "BuildingCode")
private String id;

这将使 JPA 期望数据库 table 中有一个名为 building_code 的列,如果找不到,它将创建名为 building_code 的列,数据大小为 varchar( 255) 和“不为空”。

在您的插入查询中,它具有 BuildingCode 列的值但没有新创建的 building_code 列的值,因此出现错误 -

**NULL not allowed for column "BUILDING_CODE"**

同样适用于其他 Camel-cased 列,即

BuildingName, 
BuildAbr,
SquareFt,
AssetId 

结论:如果你不希望JPA创建带下划线的列,请不要在实体中以驼​​峰式大小写提及列名。 如果您按如下方式更改列定义,您的代码将起作用:

@Id
@Column(name = "Buildingcode") //change camel case to title case
private String id;

但是,我建议简单地更改 create table 中的列名称并插入 table 脚本以具有下划线,如下所示:

    create table property(
      latitude        NUMERIC(9,6) NOT NULL,
      longitude       NUMERIC(10,6) NOT NULL,
      building_code   VARCHAR(5) NOT NULL PRIMARY KEY,
      building_name   VARCHAR(42) NOT NULL,
      build_abr       VARCHAR(18) NOT NULL,
      address         VARCHAR(42) NOT NULL,
      square_ft       INTEGER,
      asset_id        INTEGER
    );
        
    insert into property 
    ( latitude, 
         longitude,
         building_code,
         building_name,
         build_abr,
         address,
         square_ft,
         asset_id) 
    values (43.453696,
         -76.544895,
         '0006',
         'Lanigan Hall',
         'LANIGAN-6',
         'some address',
         88200,
         1743);