工具:JPA 2.5.1、Hibernate、postgresql
Maven依赖
```xml
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
但我用没成功…貌似会报错说非基本特性,要加一个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绑定。
文章链接
发表评论