我的对象图由 Hibernate 实体组成。现在大多数对象不存在于新数据库中。但是有些人这样做。所以我的对象是这样的:
Class MyObject{
Set<B> bset;
Set<C> cset;
}
bset
中的项需要在反序列化后实例化并持久化。但是,cset
中的项目已经存在于新数据库中,因此我不想创建新实例。告诉 Jackson 我知道如何找到这些引用资料的最佳方式是什么?现在我正在考虑为 cset
使用自定义序列化器/反序列化器,它将通过创建一个具有数据库 ID 的对象来序列化它,然后通过从数据库中提取适当的对象来反序列化它。
这有点复杂,我希望有一个更简单的解决方案。有什么建议么?
最佳答案
想通了。我需要三样东西:
JsonCreator 获取 entityManager 和返回对象的 id
@JsonCreator @IgnoredMethod public static UiElement findById(@JacksonInject EntityManager entityManager, @JsonProperty("id") int id) { return entityManager.find(UiElement.class, id); }
一个 JsonValue getter 返回一个只有 id 的对象
@JsonValue @Transient public Map<String,Integer> getJsonObject(){ HashMap<String,Integer> map = new HashMap<String,Integer>(); map.put("id", getId()); return map; }
实体管理器需要注入(inject)到ObjectMapper
//entitymanager for creating any static data based entities InjectableValues injects = new InjectableValues.Std().addValue(EntityManager.class, entityManager); mapper.setInjectableValues(injects);
关于java - 反序列化 Java 对象时引用现有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753323/