如何将延迟获取的hibernate字段序列化为引用



使用带有Hibernate的Jackson,我得到了一些延迟提取字段。我希望它们由其id表示(类似于@JsonIdentityReference的效果),而不是嵌入整个对象或为null。

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

  1. 对于Jackson数据类型hibernate,延迟提取的字段被序列化为null,而我需要引用
  2. 使用@JsonIdentityReference,并将fetchType更改为渴望,我得到了序列化为id(reference)的字段。然而,这个领域被急切地吸引,这是性能的一个缺点

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

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

提前感谢!

除了将FORCE_LAZY_LOADING设置为false外,您还尝试过HibernateModule的此功能吗?:

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

未初始化的代理上的输出看起来像:

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

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

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

最新更新