我有一个具有以下结构的 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/