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