使用带有Hibernate的Jackson,我得到了一些延迟提取字段。我希望它们由其id表示(类似于@JsonIdentityReference的效果),而不是嵌入整个对象或为null。
然而,我只能达到以下效果:
- 对于Jackson数据类型hibernate,延迟提取的字段被序列化为null,而我需要引用
- 使用@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();
}