Intellij Idea 为什么转换后的列标记为JpaAttributeTypeInspection,并显示错误消息“'Basic'属性类型不应是Map”?

brvekthn  于 2023-01-25  发布在  其他
关注(0)|答案(3)|浏览(209)

我尝试通过JPA和Spring将一些JSON存储为列中的字符串,并遵循baeldung tutorial。我的代码如下:

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

MyEntityExtentionConverterjavax.persistence.AttributeConverter<Map<String, Object>, String>的一个实现,它使用JacksonObjectMapper来回转换字符串。
根据提到的教程,这应该是它,但现在我得到一个错误,
“Basic”属性类型不应是Map
从理论上讲,我可以通过向注解中添加@SuppressWarnings("JpaAttributeTypeInspection")来禁用它,但这感觉像是忽略而不是解决错误。

m3eecexj

m3eecexj1#

您必须使用@Type注解属性“myEntityExtension”,但无法同时添加@Type和@Convert..

正如你所看到的in this tutorial你必须在你的实体顶部定义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;

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

也就是说,我使用的是hib5.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>
jfgube3f

jfgube3f2#

看起来这是IntelliJ IDEA的一个问题:
https://youtrack.jetbrains.com/issue/IDEA-270687
我们可以通过以下方式使用变通方案:使用@SuppressWarnings("JpaAttributeTypeInspection")注解可删除该警告。

rqqzpn5f

rqqzpn5f3#

该字段不应持久化。请删除@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;
}

相关问题