我正在使用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
下面是完整的错误详细信息
check
)作为列名。尝试以其他方式命名该列:@NonNull
@Column(name="another_column_name")
private String check;
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;