【问题标题】:How to serialize a lazy fetched hibernate field as reference?如何序列化延迟获取的休眠字段作为参考?
【发布时间】:2017-11-02 11:46:12
【问题描述】:

将 Jackson 与 Hibernate 结合使用,我有一些懒惰的获取字段。我希望它们由它的 id 表示(类似于@JsonIdentityReference 的效果),而不是嵌入整个对象或作为 null。

但是,我只能达到以下效果:

  1. 使用 Jackson-datatype-hibernate,延迟获取的字段被序列化为 null,而我需要参考。
  2. 使用@JsonIdentityReference,并将fetchType 更改为eager,我将字段序列化为id(参考)。但是,该字段被急切地获取,这对性能来说是一个缺点。

我想要一个具有上述两种情况优势的解决方案:该字段是惰性获取的,因此除非需要,否则无需查询数据库。生成的 Json 对象中包含一个 id 引用,以便客户端可以发出单独的查询以获取具有引用的实体。

我的意图类似于 spring data rest 所做的:同一聚合根中的实体嵌入到聚合根中。与其他聚合根的关系表示为链接。

提前致谢!

【问题讨论】:

    标签: hibernate jackson spring-data-jpa lazy-loading


    【解决方案1】:

    你有没有试过HibernateModule这个功能加上FORCE_LAZY_LOADING为假?:

    hibernateModule.configure(Feature.FORCE_LAZY_LOADING, false); 
    hibernateModule.configure(Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
    

    未初始化代理的输出如下所示:

    {
        "somefield" : "value",
        "link": {
            "id" = idValue
        }
    }
    

    【讨论】:

    【解决方案2】:

    我认为您可以扩展 Hibernate5Module(Hibernate4Module) 并自己添加 id。 从代理获取id

    public static Serializable getId(Object persistent) {
        if (!(persistent instanceof HibernateProxy)) {
            return null;
        }
    
        LazyInitializer initializer = ((HibernateProxy) persistent)
            .getHibernateLazyInitializer();
    
        return initializer.getIdentifier();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多