java - 自动将 JPA 实体的 JSON 字符串列映射到 Java 对象

标签 java json jpa jackson

我有一个具有以下结构的 JPA 实体对象:

@Table(name="item_info")
class Item(){
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="item_name")
    private String itemName;

    @Column(name="product_sku")
    private String productSku;

    @Column(name="item_json")
    private String itemJsonString;

    @Transient
    private ItemJson itemJson;

    //Getters and setters

}

itemJsonString 字段包含一个 json 字符串值,例如 '{"key1":"value1","key2":"value2"}'

itemJson 字段包含对应的对象,映射到json 字符串。

我从数据库中获取这个实体对象如下:

Item item = itemRepository.findOne(1L);    // Returns item with id 1

现在,itemJson 字段为空,因为它是一个 transient 字段。我必须使用 Jackson 的 ObjectMapper 手动设置它,如下所示:

itemJson = objectMapper.readValue(item.getItemJsonString(), ItemJson.class);

我怎样才能让它在我执行 itemRepository.findOne() 时返回一个 Item 对象,其中 itemJson 字段自动映射到 json 字符串?

最佳答案

最好的办法是实现 javax.persistence.Converter。它看起来像:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<ItemJson, String> {

    @Override
    public String convertToDatabaseColumn(ItemJson entityValue) {
        if( entityValue == null )
            return null;

        ObjectMapper mapper = new ObjectMapper();

        return mapper.writeValueAsString(entityValue);
    }

    @Override
    public ItemJson convertToEntityAttribute(String databaseValue) {
        if( databaseValue == null )
            return null;

        ObjectMapper mapper = new ObjectMapper();

        return mapper.readValue(databaseValue, ItemJson.class);

    }
}

我已经将它与 WildFly 一起使用,除了将它放在我正在部署的 war 文件中外,不需要做任何事情。

关于java - 自动将 JPA 实体的 JSON 字符串列映射到 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35613527/

相关文章:

java - 从另一个类中的 JPanel 文本字段获取值

json - 使用 Express.js (node.js) 进行动态路由的最佳方式

json - 在Spray POST路由内提取原始JSON作为字符串

java - 无法使用复合键保存实体

java - 在java中获取用于tcp连接的开放套接字

Java 执行器和长生命周期线程

java - 具有共享主键的 OneToOne 关系生成 n+1 个选择;任何解决方法?

hibernate - JPA 2.1 实体图返回重复结果

java - Tomcat + JPA + MySQL : java. lang.NoClassDefFoundError: javax/persistence/Persistence

c# - 无效的 JSON 原语 : object : Passing Object as a Parameter from aspx