反序列化Java对象时引用现有数据?

时间:2013-09-12 00:11:25

标签: java json hibernate serialization jackson

我的对象图由Hibernate实体组成。现在,新数据库中不存在大多数对象。不过有些人这样做所以我的目标是这样的:

Class MyObject{ 
  Set<B> bset;
  Set<C> cset; 
}

反序列化后,bset中的项需要实例化并保留。但是,cset中的项已经存在于新数据库中,因此我不希望创建新实例。什么是告诉杰克逊的最佳方式我知道如何找到这些参考?现在我正在考虑为cset使用自定义序列化器/反序列化器,它将通过创建具有数据库ID的对象来序列化它,然后通过从数据库中拉出适当的对象来反序列化它。

这有点复杂,我希望有一个更简单的解决方案。有什么建议?

1 个答案:

答案 0 :(得分:4)

想出来。我需要三件事:

  1. 获取entityManager的JsonCreator,以及返回对象的id

    @JsonCreator
    @IgnoredMethod
    public static UiElement findById(@JacksonInject EntityManager entityManager, @JsonProperty("id") int id) {
        return entityManager.find(UiElement.class, id);
    }
    
  2. JsonValue getter返回只有id

    的对象
    @JsonValue
    @Transient
    public Map<String,Integer> getJsonObject(){
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        map.put("id", getId());
        return map;
    }
    
  3. 需要将实体管理器注入ObjectMapper

    //entitymanager for creating any static data based entities
    InjectableValues injects = new InjectableValues.Std().addValue(EntityManager.class, entityManager);
    mapper.setInjectableValues(injects);