【问题标题】:create mysql table with json column inside spring boot , hibernate schema validation fails在spring boot中创建带有json列的mysql表,休眠模式验证失败
【发布时间】:2017-08-10 02:18:13
【问题描述】:

我想创建一个带有 Json 列的表格。

我得到了一个代表那个表的实体,其中代表json类型的字段使用了一个json转换器:

实体:

    @Entity
public class GroupEntity {

    @NotNull
    private String groupId;

    @Id
    @NotNull
    private String propertiesStr;


    public GroupEntity() {
        // For JPA
    }

    @Convert(converter = GroupPropertiesJsonConverter.class)
    private HostProperties propertiesDto;

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

    public String getPropertiesStr() {
        return propertiesStr;
    }

    public void setPropertiesStr(String propertiesStr) {
        this.propertiesStr = propertiesStr;
    }

    public HostProperties getPropertiesDto() {
        return propertiesDto;
    }

    public void setPropertiesDto(HostProperties propertiesDto) {
        this.propertiesDto = propertiesDto;
    }
}

GroupPropertiesJsonConverter 是:

public class GroupPropertiesJsonConverter implements
    AttributeConverter<HostProperties, String> {

    private static final Logger log = Logger.getLogger(GroupPropertiesJsonConverter.class);
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(HostProperties hostProperties) {
        try {
            return objectMapper.writeValueAsString(hostProperties);
        } catch (JsonProcessingException e) {
            log.error("coudln't convert HostProperties Dto to json, wont persist");
            return null;
        }
    }

    @Override
    public HostProperties convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, HostProperties.class);
        } catch (IOException e) {
            log.info("couldn't convert json of properties to Dto", e);
        }
        return null;
    }
}

sql 脚本

create table group_entity (
    properties_str varchar(255) not null, 
    group_id varchar(255) not null, 
    properties_dto JSON, primary key (properties_str)
);

当 spring boot 应用程序出现以下 hibernate schema 验证错误

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [properties_dto] in table [group_entity]; found [json (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType(SchemaValidatorImpl.java:105)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:92)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:50)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:91)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:475)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)

据我了解,Hibernate 将我的 entity 字段解析为 varchar,即使我使用的是转换器注释。

properties_dto JSON 更改为properties_dto varchar(255) 确实可以解决问题,但这不是json 类型!

我做错了什么?如何正确配置此表?

【问题讨论】:

    标签: json hibernate spring-data


    【解决方案1】:

    由于您将其简单地转换为 String,因此就 Hibernate 而言,它只是一个 String 属性。 Hibernate 似乎不支持开箱即用的 JSON,因此您必须实现自己的用户类型才能这样做。

    这是article describing how to create a JSON user type

    【讨论】:

      【解决方案2】:

      如果你想在实体类中创建一列 json 类型的,那么只需使用

      @Column(columnDefinition="json")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-16
        • 2020-12-16
        • 2019-01-20
        • 2019-09-29
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多