12

我试图通过 JPA 和 Spring 将一些 JSON 作为字符串存储在列中,并遵循baeldung 教程。我的代码是这样的:

    @Column
    @Convert(converter = MyEntityExtentionConverter.class)
    private Map<String, Object> myEntityExtention;

MyEntityExtentionConverter是一个javax.persistence.AttributeConverter<Map<String, Object>, String>使用 Jackson 来回转换字符串的实现ObjectMapper

根据提到的教程这应该是它,但是现在我得到一个错误

“基本”属性类型不应是地图

理论上我可以通过添加@SuppressWarnings("JpaAttributeTypeInspection")注释来禁用它,但这感觉就像忽略而不是解决错误。我在这里做错了什么?

4

3 回答 3

5

看起来这是来自 IntelliJ IDEA 的问题:

https://youtrack.jetbrains.com/issue/IDEA-270687

我们可以通过这种方式使用解决方法:使用@SuppressWarnings("JpaAttributeTypeInspection")注释删除警告。

于 2021-06-09T04:31:45.543 回答
4

您必须使用 @Type 注释道具“myEntityExtention”,不能同时添加 @Type 和 @Convert..

正如您在本教程 中看到的,您必须在实体顶部定义 json 类型:

@Entity
@Table(name = "some_table_name")
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class CustomEntity {

然后添加@Type注释而不是@Convert

@Type( type = "json" )
private Map<String, Object> myEntityExtention;

确保添加所有正确的依赖项/版本。

IE 我使用的是休眠 5.4,所以我的依赖项是:

<!-- Hibernate ORM core version 5.4.21.Final (inherited from spring-boot 2.3.4)-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>        
 </parent>
<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate5</artifactId>
        <version>2.8.4</version>
    </dependency>
    <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <!--for hibernate >= 5.2-->
            <version>2.10.2</version>
    </dependency>
</dependencies>
于 2021-01-20T14:25:07.397 回答
1

该字段不应该被持久化。删除@Column 注释并使用@Transient。您应该将其保存为 JSON,这将在 customerAttributeJSON 中完成,当从数据库中读取 customerAttributes 时,您可以将其与 DTO 一起使用。

@Entity
@Table(name = "Customers")
public class Customer {
 
    @Id
    private int id;
 
    private String firstName;
 
    private String lastName;
 
    private String customerAttributeJSON;
 
    @Transient
    @Convert(converter = HashMapConverter.class)
    private Map<String, Object> customerAttributes;
}

于 2020-11-20T10:51:29.723 回答