如何将延迟获取的休眠字段序列化为参考?
How to serialize a lazy fetched hibernate field as reference?
将 Jackson 与 Hibernate 结合使用,我有一些延迟获取的字段。我希望它们由其 id 表示(类似于 @JsonIdentityReference 的效果),而不是嵌入整个对象或作为 null.
但是我只能实现如下效果:
- 使用 Jackson-datatype-hibernate,延迟获取的字段被序列化为 null,而我需要引用。
- 使用@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
}
}
将 Jackson 与 Hibernate 结合使用,我有一些延迟获取的字段。我希望它们由其 id 表示(类似于 @JsonIdentityReference 的效果),而不是嵌入整个对象或作为 null.
但是我只能实现如下效果:
- 使用 Jackson-datatype-hibernate,延迟获取的字段被序列化为 null,而我需要引用。
- 使用@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
}
}