org.hibernate.tool.schema.spi.CommandAcceptanceException: 执行 DDL "create table TABLE_JSON 时出错



我正在使用Spring引导,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"create table table_JSON(id varchar(255)not null,check varchar(225),JSON_data TEXT,primary key(id))"时出错位于org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)~[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.applyqlString(SchemaCreatorImpl.java:439)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:423)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:314)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoo协调器.java:156)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.proc(SchemaManagementToolCooCoordinater.java:73)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:320)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilder Impl.java:462)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBBuilderImpl.java:1237)[hibernate-core-54.4.10.Final.jar:5.4.10.Final]网址:org.springframework.om.jpa.vendor.SpringHibernate JpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernate jpa PersistenceProvider.java:58)[spring-orm-5.5.2.3.REASE.jar:5.2.3.REASE]位于org.springframework.om.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManager FactoryBean.java:365)[spring-orm-5.5.2.3.REASE.jar:5.2.3.REASE]在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)[spring-orm-5.5.2.3.REASE.jar:5.2.3.REASE]在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)[spring-orm-5.5.2.3.REASE.jar:5.2.3.REASE]在org.springframework.om.jpa.LocalContainerEntityManagerFactoryBean.fafterPropertiesSet(LocalContainerEntityManager FactoryBean.java:341)[spring-orm-5.5.2.3.REASE.jar:5.2.3.REASE]位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)[spring-beans-53.RELEASE.jar:5.2.3.REASE]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)[spring-beans-53.RELEASE.jar:5.2.3.REASE]网址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)[spring-bans-5.2.3.RELEASE.jar:5.2.3.REASE]位于org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)[spring-beans-53.RELEASE.jar:5.2.3.REASE]位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)~[spring-beans-53.RELEASE.jar:5.2.3.REASE]网址:org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)[spring-beans-53.RELEASE.jar:5.2.3.REASE]网址:org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory:java:202)[spring-beans-53.RELEASE.jar:5.2.3.REASE]位于org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)~[spring-context-5.2.3.RELEASE.jar:5.2.3.REASE]位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)~[spring-context-5.2.3.RELEASE.jar:5.2.3.REASE]网址:org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)~[spring-context-5.2.3.RELEASE.jar:5.2.3.REASE]位于org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplication context.java:141)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.REASE]网址:org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.REASE]网址:org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.REASE]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:315)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RRELEASE]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RRELEASE]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)~[spring-boot-2.2.4.RELEASE.jar:2.2.4.RRELEASE]网址:com.spglobal.rates.rap.modelconfig.Application.main(Application.java:10)~[classes/:na]在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[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.ioke(Method.java:498)~[na:1.8.0_201]

check是SQL Reserved关键字,因此不能将check用作没有引号/反勾号的列名。默认情况下,hibernate在查询中不使用引号/反勾号作为列名。你可以用这种方式显式使用反勾号/报价

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

在某些数据库中,backtick不起作用,例如:postgresql为它们使用报价

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

或者,您可以在配置文件中强制hibernate对列和表名使用引号

hibernate.globally_quoted_identifiers=true

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

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

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

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

我也遇到了同样的问题,最后我意识到了。我的表名是保留关键字请不要在postgresql中使用保留关键字作为表名、列名

最新更新