mep*_*ori 10 json hibernate jpa intellij-idea javax.persistence
我试图通过 JPA 和 Spring 将一些 JSON 作为字符串存储在列中,并且正在关注baeldung 教程。我的代码是这样的:
@Column
@Convert(converter = MyEntityExtentionConverter.class)
private Map<String, Object> myEntityExtention;
Run Code Online (Sandbox Code Playgroud)
MyEntityExtentionConverter是一种javax.persistence.AttributeConverter<Map<String, Object>, String>使用 Jackson 来回转换字符串的实现ObjectMapper。
根据提到的教程,这应该是它,但是现在我收到一个错误
“基本”属性类型不应是地图
理论上我可以通过添加@SuppressWarnings("JpaAttributeTypeInspection")注释来禁用它,但这感觉就像忽略而不是解决错误。我在这里做错了什么?
Mik*_*son 10
您必须使用 @Type 注释 prop“myEntityExtention”,但不可能同时添加 @Type 和 @Convert。
正如您在本教程中 看到的,您必须在实体顶部定义 json 类型:
@Entity
@Table(name = "some_table_name")
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class CustomEntity {
Run Code Online (Sandbox Code Playgroud)
然后添加@Type注解而不是@Convert:
@Type( type = "json" )
private Map<String, Object> myEntityExtention;
Run Code Online (Sandbox Code Playgroud)
请务必添加所有正确的依赖项/版本。
IE 我正在使用 hibernate 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>
Run Code Online (Sandbox Code Playgroud)
看起来这是 IntelliJ IDEA 的问题:
https://youtrack.jetbrains.com/issue/IDEA-270687
我们可以通过这种方式使用解决方法:使用@SuppressWarnings("JpaAttributeTypeInspection")注释删除警告。
小智 0
该字段并不意味着要保留。删除@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;
}
Run Code Online (Sandbox Code Playgroud)