Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何序列化一个懒散获取的hibernate字段作为引用?_Hibernate_Jackson_Spring Data Jpa_Lazy Loading - Fatal编程技术网

如何序列化一个懒散获取的hibernate字段作为引用?

如何序列化一个懒散获取的hibernate字段作为引用?,hibernate,jackson,spring-data-jpa,lazy-loading,Hibernate,Jackson,Spring Data Jpa,Lazy Loading,使用Jackson和Hibernate,我有一些惰性的字段。我希望它们由其id表示(类似于@JsonIdentityReference的效果),而不是嵌入整个对象或作为null 然而,我只能达到以下效果: 使用Jackson数据类型hibernate,惰性获取的字段被序列化为null,而我需要引用 使用@jsonidentialreference,并将fetchType更改为eager,我将字段序列化为id(reference)。然而,该字段被急切地获取,这是性能的一个缺点 我希望解决方案具有上

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

然而,我只能达到以下效果:

  • 使用Jackson数据类型hibernate,惰性获取的字段被序列化为null,而我需要引用
  • 使用@jsonidentialreference,并将fetchType更改为eager,我将字段序列化为id(reference)。然而,该字段被急切地获取,这是性能的一个缺点
  • 我希望解决方案具有上述两种情况的优点:字段是延迟获取的,因此除非需要,否则不需要查询数据库。生成的Json对象中包含一个id引用,因此客户机可以发出一个单独的查询来获取具有该引用的实体

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


    提前谢谢

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

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

    您是否尝试了
    HibernateModule
    的此功能以及
    FORCE\u LAZY\u LOADING
    为false

    hibernateModule.configure(Feature.FORCE_LAZY_LOADING, false); 
    hibernateModule.configure(Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
    
    未初始化代理上的输出如下所示:

    {
        "somefield" : "value",
        "link": {
            "id" = idValue
        }
    }
    
    您必须使用上述配置在中注册。