I was trying to store some JSON as a string in a column via JPA and Spring and was following a baeldung tutorial. My code like this:
@Column
@Convert(converter = MyEntityExtentionConverter.class)
private Map<String, Object> myEntityExtention;
MyEntityExtentionConverter
is an implementation of javax.persistence.AttributeConverter<Map<String, Object>, String>
that converts the string back and forth using the Jackson ObjectMapper
.
According to mentioned tutorial this should have been it, however now I get an Error that
'Basic' attribute type should not be a map
Theoretically I could disable it by adding @SuppressWarnings("JpaAttributeTypeInspection")
to the annotations, but that feels like ignoring rather than solving the error. What am I doing wrong here?
Look like this is an issue from IntelliJ IDEA:
https://youtrack.jetbrains.com/issue/IDEA-270687
We can use workaround by this way:
Using the @SuppressWarnings("JpaAttributeTypeInspection")
annotation removes the warning.
You have to annotate prop "myEntityExtention" with @Type but is not possible to add both @Type and @Convert..
as you can see in this tutorial you have to define the json type on the top of your entity:
@Entity
@Table(name = "some_table_name")
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class CustomEntity {
then add @Type annotation instead @Convert:
@Type( type = "json" )
private Map<String, Object> myEntityExtention;
be sure to add all the right dependencies/versions.
I.E. i'm using hibernate 5.4 so my dependencies are:
<!-- 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>
That field is not meant to be persisted. Remove the @Column annotation and use @Transient. You are supposed to persist it as a JSON which will be done in the customerAttributeJSON, when reading from the database the customerAttributes will be populated and you can use it with DTOs.
@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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With