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);
我无法填充内存中的 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);