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

标签 java json hibernate serialization jackson

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

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

bset中的项需要在反序列化后实例化并持久化。但是,cset 中的项目已经存在于新数据库中,因此我不想创建新实例。告诉 Jackson 我知道如何找到这些引用资料的最佳方式是什么?现在我正在考虑为 cset 使用自定义序列化器/反序列化器,它将通过创建一个具有数据库 ID 的对象来序列化它,然后通过从数据库中提取适当的对象来反序列化它。

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

最佳答案

想通了。我需要三样东西:

  1. JsonCreator 获取 entityManager 和返回对象的 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. 实体管理器需要注入(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/

相关文章:

java - 如何重构方法以使其更易于测试

android - 在android中递归读取json对象递归?

hibernate - java.lang.NoSuchMethodError : javax/persistence/spi/PersistenceUnitInfo. getValidationMode()Ljavax/persistence/ValidationMode

java - Spring Data Avg NullPointerException

java - 如何在Spark中将一个RDD拆分成多个?

java - 与 Mockito Mock 进行宽松的字符串匹配

java - 如何用单个字符替换多组字符

java - 序列化和反序列化 Map<Object, Object> Jackson

javascript - 如何在 Node 中显示json格式的行内容?

java - 如何在spring Controller 中绑定(bind)来自jsp的对象