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

问题描述 投票:1回答:2

我正在使用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;

}

下面是Converter类

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

下面是完整的错误详细信息

hibernate spring-boot spring-data-jpa spring-data
2个回答
0
投票
我认为您正在尝试使用SQL关键字(check)作为列名。尝试以其他方式命名该列:

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


0
投票
checkSQL 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;

© www.soinside.com 2019 - 2024. All rights reserved.