org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错“创建表 TABLE_JSON

Posted

技术标签:

【中文标题】org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错“创建表 TABLE_JSON【英文标题】:org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table TABLE_JSON 【发布时间】:2020-08-28 10:18:50 【问题描述】:

我使用的是 Spring boot,H2 数据库

我的要求是将json字符串存储到数据库中。

下面是我的实体类

import org.json.JSONObject;

@Entity
@Table(name = "TABLE_JSON")
public class DataJson 

    @Id
    @Type(type = "uuid-char")
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", updatable = false, nullable = false)
    private UUID id;

    @NonNull
    private String check;

    @NonNull
    @Column(columnDefinition = "TEXT")
    @Convert(converter= JSONObjectConverterForMe.class)
    private JSONObject json_data;


下面是转换器类

import org.json.JSONObject;

@Converter
public class JSONObjectConverterForMe implements AttributeConverter<JSONObject, String> 
    @Override
    public String convertToDatabaseColumn(JSONObject jsonData) 
        String json;
        try
            json = jsonData.toString();
        
        catch (NullPointerException ex)
        
            //extend error handling here if you want
            json = "";
        
        return json;
    

    @Override
    public JSONObject convertToEntityAttribute(String jsonDataAsJson) 
        JSONObject jsonData;
        try 
            jsonData = new JSONObject(jsonDataAsJson);
         catch (JSONException ex) 
            //extend error handling here if you want
            jsonData = null;
        
        return jsonData;
    

当我运行 spring boot 应用程序时,出现以下错误

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table TABLE_JSON (id varchar(255) not null, check varchar(255), json_data TEXT, primary key (id))" via JDBC Statement

以下是完整的错误详情

org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 JDBC 语句执行 DDL“创建表 TABLE_JSON (id varchar(255) not null, check varchar(255), json_data TEXT, primary key (id))”时出错 在 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:439) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:423) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:314) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:156) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:320) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1237) [hibernate-core-5.4.10.Final.jar:5.4.10.Final] 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) [spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) [spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) [spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) [spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) [spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) [spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE] 在 com.spglobal.ratings.rap.modelconfig.Application.main(Application.java:10) ~[classes/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]

【问题讨论】:

【参考方案1】:

check 是SQL Reserved keyword,因此您不能使用check 作为没有引号/反引号的列名。 默认情况下,hibernate 不使用引号/反引号作为查询中的列名。您可以通过这种方式显式使用反引号/引号

@Column(name="`check`")
private String check;

在某些数据库中,反引号不起作用,例如:postgresql 为它们使用引号

@Column(name="\"check\"")
private String check;

或者你可以在配置文件中强制休眠使用引用作为列名和表名

hibernate.globally_quoted_identifiers=true

您还应该指定id 列的长度,默认情况下它是 255,这会产生问题。

@Column(name = "id", length = 36 , updatable = false, nullable = false)
private UUID id;

【讨论】:

【参考方案2】:

我认为您正在尝试使用 SQL 关键字 (check) 作为列名。尝试以不同的方式命名该列:

@NonNull
@Column(name="another_column_name")
private String check;

【讨论】:

以上是关于org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错“创建表 TABLE_JSON的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错“创建表 TABLE_JSON

org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错

org.hibernate.tool.schema.spi.CommandAcceptanceException:在使用 h2 和 JPA 的 SpringBoot 中通过 JDBC 语句执行 DDL

Error executing DDL via JDBC Statement

springboot整合JPA创建数据库表失败

Hibernate + JPA:模式验证:缺少列