当前位置: 首页 > 知识库问答 >
问题:

Spring Boot和H2表填充错误:org.hibernate.tool.schema.spi.命令接受异常:执行DDL错误

濮阳靖
2023-03-14

我在获取H2 In Memory数据库以填充时遇到麻烦。这里的想法是拥有唯一的BuildingCode作为主键和id。

我发现了以下类级错误:

org.hibernate.tool.schema.spi.命令验收异常:通过JDBC语句执行DDL“更改表属性添加列building_codevarchar(255)not null”时出错

原因: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() + "]";
    }
}

表格创建和示例插入

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);

这是我的申请表。属性

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

共有1个答案

夏骞尧
2023-03-14

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

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

这将使JPA在DB表中期待一个名为building_code的列,如果找不到,它将创建一个名为building_code的列,数据大小为varchar(255)且“NOTNULL”。

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

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

同样的情况也适用于其他骆驼壳柱,即。

BuildingName, 
BuildAbr,
SquareFt,
AssetId 

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

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

但是,相反,我建议在创建表和插入表脚本中简单地更改列名以具有下划线,如下所示:

sql prettyprint-override">    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);
 类似资料:
  • 问题内容: 我是hibernate世界和面对的新手, 在hibernate5.2.9版本中运行独立程序时出现异常。但是在hibernate4版本中,我所有的代码都运行良好。我寻找了很多问题并解决了,但没有得到有效的答案。 配置文件 Pom.xml 实用文件 实体文件 主要方法 安慰 问题答案: 您应该尝试使用另一种方言,例如OR 或OR,以查看哪种方言适合您。 总而言之,您的当前方言正在creat

  • 我想在springboot中通过H2创建表,但运行时出现以下错误:; 组织。冬眠地方话方言:hh000400:使用方言:org。冬眠地方话H2方言组织。冬眠工具模式。spi。CommandAcceptanceException:通过JDBC语句执行DDL“创建表bank_account(id bigint not null,balance double not null,full name var

  • 我的模特 类型化 这是我的财产 错误 组织。冬眠工具模式。spi。CommandAcceptanceException:通过JDBC语句执行DDL“alter table vendeur add constraint FKovj5q276gfleu04t5gfjr3ayx外键(id_type_vente)引用type_de_vente(id)”时出错 这里所有的错误 请你帮帮我。提前谢谢你

  • 也许我完全误解了应该如何工作,但除了返回错误之外,我似乎无法让它做任何事情。 我是这么做的: Mongod正在运行 我想备份一个名为“mydb”的数据库 我在mongo shell中 我尝试了命令并得到了上面的错误 我尝试了和,都有相同的问题 我在这里做错了什么?

  • 我在集群模式下使用AWS ElastiCache(Redis)。我有两个实现来连接ElastiCache。其中一种实现是直接使用本机莴苣驱动程序,另一种是使用Spring数据,并将莴苣作为底层驱动程序。AWS ElastiCache具有群集配置endpoint。我想用这个endpoint连接到ElastiCache。我能够使用带有本机驱动程序实现的群集endpoint成功连接到ElastiCach

  • 错误处理是每个编程语言都要考虑的一个重要话题。在Go语言的错误处理中,错误是软件包API和应用程序用户界面的一个重要组成部分。 在程序中总有一部分函数总是要求必须能够成功的运行。比如strconv.Itoa将整数转换为字符串,从数组或切片中读写元素,从map读取已经存在的元素等。这类操作在运行时几乎不会失败,除非程序中有BUG,或遇到灾难性的、不可预料的情况,比如运行时的内存溢出。如果真的遇到真正