当前位置: 首页 > 知识库问答 >
问题:

在spring boot中创建带有json列的mysql表,hibernate模式验证失败

单于承
2023-03-14

我想创建一个包含 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启动应用程序时,我收到以下Hibernate模式验证错误

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将我的实体字段解析varchar,即使我使用的是转换器注释。

将<code>properties_dto JSON确实解决了这个问题,但这不是JSON类型!

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

共有2个答案

云新知
2023-03-14

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

下面是一篇介绍如何创建 JSON 用户类型的文章。

安建木
2023-03-14

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

@Column(columnDefinition="json")
 类似资料:
  • 当使用Hibernate validator验证JPA实体是否与数据库模式匹配时(通常设置< code > Hibernate . DDL-auto = verify ),如果遇到映射到< code>String字段的MySQL ,就会失败。 例如,这个MySQL表模式: 可以映射到JPA实体,如下所示: 验证过程将失败,但出现以下异常: org . hibernate . tool . Sche

  • 下面是我的dispatcher-servlet.xml文件: http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context/spring-context

  • 我不熟悉java和springboot。我正在尝试使用springboot创建一个CRUD应用程序。我使用MySQL存储数据。 员工模式- 员工资源库- 员工控制员- 上面的控制器在JSON对象数组表单中给出了结果,如下所示 但我需要以下表格的回复 非常感谢你的帮助。

  • 我有一个用例,我将把一个json-schema作为输入,验证它,然后保存在我的系统中。稍后,我将获取json数据,我需要使用上面提到的json-schema来验证这些数据。给定这个场景,我需要执行两个级别的验证: 我使用的是json-schema-validator jar,只能找到第二级验证,在文档中找不到json-schema验证。例如:假设我们有以下示例json-schema:

  • 环境类 SpringBoot 2,H2作为测试依赖项。 生产厂 Jar被部署到云上。DB2服务配置了驱动程序和连接细节,并自动绑定到java应用程序。jar本身没有配置。这就是应用程序。属性文件,但它是空的。这部分工作正常,我希望有一个解决方案存在,它将不需要我创建属性文件和配置文件。 “未找到架构xxx”上的本地单元测试崩溃 不存在数据源配置。 SpringBoot看到H2依赖,并默认选择Hib

  • 我正在使用Spring Boot和[jackson-module-jsonSchema](https://github.com/fasterxml/jackson-module-jsonSchema)构建一个REST API,用于生成JSON模式。我正在寻找一种最好的方法来验证到达我的APIendpoint(Spring控制器)的请求JSON有效负载,该有效负载是根据为公开资源定义的已定义JSON