我有一个具有以下结构的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"}'
'{"key1":"value1","key2":"value2"}'
并且itemJson字段包含对应的对象,该对象映射到json字符串。
我从数据库中获取此实体对象,如下所示:
Item item = itemRepository.findOne(1L); // Returns item with id 1
现在,itemJson字段为空,因为它是一个瞬态字段。我必须使用Jackson的ObjectMapper手动设置它,如下所示:
itemJson = objectMapper.readValue(item.getItemJsonString(), ItemJson.class);
我怎样才能做到这一点,当我这样做时itemRepository.findOne(),它会返回一个Item对象,并将itemJson字段自动映射到json字符串?
itemRepository.findOne()
最好的选择是实现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文件中之外,无需执行任何操作。