工具:JPA 2.5.1、Hibernate、postgresql

Maven依赖

com.vladmihalcea

hibernate-types-52

2.10.4

​```xml

com.fasterxml.jackson.core

jackson-databind

2.13.3

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 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绑定。

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: