工具:JPA 2.5.1、Hibernate、postgresql
Maven依赖
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.10.4</version>
</dependency>
```xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
1、映射到一个java对象
- 对象
import lombok.Data;
import java.io.Serializable;
@Data
public class Person implements Serializable {
private String name;
private int number;
}
- 映射表中的实体
@TypeDefs({
@TypeDef(name = "json", typeClass = JsonStringType.class),
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@MappedSuperclass
public class BaseEntity {
}
@Entity
@Table(name = "aa")
public class AA extends BaseEntity {
@Type(type = "jsonb")
@Column(name = "person")
private Person person;
}
2、映射到Map
- 参考:https://stackoverflow.com/questions/62232055/how-to-save-json-object-in-postgresql-using-hibernate-in-java
- 编写转换器的版本:https://www.baeldung.com/hibernate-persist-json-object
- 通过设置Attribute Converter
@Convert(converter = HashMapConverter.class)
private Map<String, Object> customerAttributes;
- 但我用没成功…貌似会报错说非基本特性,要加一个Type注解才可以,但是这里好像也不知道加什么类型
3、thingsboard里面用法
需要映射的json字段 person(现在以一个类的形式呈现)
- 类AA
@EqualsAndHashCode(callSuper = false)
@Slf4j
@Data
public AA {
private transient Person person;
@JsonIgnore
private byte[] personBytes;
- AA 类中的Get和Set方法
public Person getPerson() {
if (person != null) {
return person;
} else {
if (personBytes != null) {
try {
person = mapper.readValue(new ByteArrayInputStream(personBytes), Person.class);
} catch (IOException e) {
log.warn("Can't deserialize person data: ", e);
return null;
}
return person;
} else {
return null;
}
}
}
public void setPerson(Person person) {
this.person = person;
try{
this.personBytes = person != null ? mapper.writeValueAsBytes(person) : null;
} catch (JsonProcessingException e) {
log.warn("Can't serialize person: ", e);
}
}
}
- 映射字段实体
public AbstractAAEntity {
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private JsonNode person;
- 和AA类进行转换的实体
public AbstractAAEntity(AA aa) {
this.person = JacksonUtil.convertValue(aa.getPerson(), ObjectNode.class);
}
打印结果方法,转换JsonNode类型到AA类
public AbstractAAEntity toAA() {
AA aa = new AA();
aa.setPerson(JacksonUtil.convertValue(person, Person.class));
最后:我不知道为什么不能用json,用jsonb就可以,数据库里面json和json类型存储都可以用代码的jsonBinary绑定。