错误:列的类型为json,但表达式的字符类型在Hibernate中有所不同 [英] ERROR: column is of type json but expression is of type character varying in Hibernate

查看:37
本文介绍了错误:列的类型为json,但表达式的字符类型在Hibernate中有所不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用Spring数据JPA将两列实体类映射为postgres中的json。在阅读了多个堆栈溢出帖子和Baeldung帖子后,

How to map a map JSON column to Java Object with JPA

https://www.baeldung.com/hibernate-persist-json-object

我进行了如下配置。但是,我面临错误&qot;错误:列";Headers";的类型为json,但表达式的类型为字符变化

请提供一些指针来解决此问题。

我有一个实体类,如下所示

@Entity
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class Task {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;
    
    private String url;
    private String httpMethod;

    @Convert(converter = HashMapConverter.class)
    @Column(columnDefinition = "json")
    private Map<String, String> headers;

    @Convert(converter = HashMapConverter.class)
    @Column(columnDefinition = "json")
    private Map<String, String> urlVariables;
}

我创建了一个测试类来测试实体是否持久化。在运行此junit时,下面的测试用例失败,错误如下

@SpringBootTest
class TaskRepositoryTest {

    private static Task randomTask = randomTask();

    @Autowired
    private TaskRepository taskRepository;

    @BeforeEach
    void setUp() {
        taskRepository.deleteAll();
        taskRepository.save(randomTask);
    }

    public static Task randomTask() {
        return randomTaskBuilder().build();
    }

    public static TaskBuilder randomTaskBuilder() {
        Map<String,String> headers = new HashMap<>();
        headers.put(randomAlphanumericString(10),randomAlphanumericString(10));

        Map<String,String> urlVariables = new HashMap<>();
        urlVariables.put(randomAlphanumericString(10),randomAlphanumericString(10));

        return builder()
                .id(randomPositiveInteger())
                .httpMethod(randomAlphanumericString(10))
                .headers(headers)
                .urlVariables(urlVariables)
                .url(randomAlphanumericString(10)));
    }
}

使用iquibase,我已经在Postgres DB中创建了表,并且我可以看到列数据类型为json。

databaseChangeLog:
  - changeSet:
      id: 1
      author: abc
      changes:
        - createTable:
            tableName: task
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
              - column:
                  name: url
                  type: varchar(250)
                  constraints:
                    nullable: false
                    unique: true
              - column:
                  name: http_method
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: headers
                  type: json
              - column:
                  name: url_variables
                  type: json
      rollback:
        - dropTable:
            tableName: task

推荐答案

以上配置不起作用。

因此,我按照下面的链接解决了用例

https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/

"Provider com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule not found" after Spring Boot Upgrade

在pom.xml中添加了其他依赖项

        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-jaxb-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.9.11</version>
        </dependency>

已删除HashMapConverter配置并在实体类中进行了以下更改

@Entity
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@TypeDefs({
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class Task {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;
    
    private String url;
    private String httpMethod;

    @Type(type = "jsonb")
    @Column(columnDefinition = "json")
    private Map<String, String> headers;

    @Type(type = "jsonb")
    @Column(columnDefinition = "json")
    private Map<String, String> urlVariables;
}

完成这些更改后,TaskRepositoryTest通过。

这篇关于错误:列的类型为json,但表达式的字符类型在Hibernate中有所不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆