如何将延迟获取的休眠字段序列化为参考?

How to serialize a lazy fetched hibernate field as reference?

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

但是我只能实现如下效果:

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

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

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

提前致谢!

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

获取id
public static Serializable getId(Object persistent) {
    if (!(persistent instanceof HibernateProxy)) {
        return null;
    }

    LazyInitializer initializer = ((HibernateProxy) persistent)
        .getHibernateLazyInitializer();

    return initializer.getIdentifier();
}

除了FORCE_LAZY_LOADING之外,您是否尝试过HibernateModule的这个功能?:

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

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

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