休眠延迟加载与复杂对象图



我有一个实体结构,

如下所示
Class A {
    // some member data
    List<Class B>
    List<Class E>
}
Class B {
    List<Class C>
}
Class C {
    List<Class D>
}
Class E {
    List<F>
} 
//...it can be deep at any level

问题是在获取数据休眠时为所有延迟加载的 Collectio 创建代理(持久包)。我根据用户需求提供数据,用户在单个调用中想要的数据深度实际上不在我的控制之中。我需要的是使用户不需要的其他收集袋为空,因为如果我不这样做,它会为我提供有关 POGO 到 DTO 转换的所有数据,如果我将其与会话分离,它会在映射/JSON 转换期间给我延迟初始化异常,有什么方法可以使我的实体 POGO 为空??还是我在传递到其他级别之前手动遍历它,任何方法/最佳实践?

Thanks.in 前进

使用休眠分离实用程序

你需要的是一个"休眠分离实用程序",就像这里一样:

https://github.com/ocpsoft/socialpm/blob/master/gwt/src/main/java/com/ocpsoft/socialpm/gwt/server/util/HibernateDetachUtility.java

这将清空所有未初始化的集合。

在视图模式中使用会话

或者,您可以使用所谓的"视图中的会话"模式。这使休眠会话在您的"视图"中保持打开状态。例如,如果要以 json 形式从 REST Web 服务返回数据,则视图将是呈现 json 的代码位。

将数据复制到表示层

另一种可能性是在代码中遍历对象图,并将要返回的内容复制到单独的值对象表示层中。可能有一些工具可以帮助自动化其中一些复制。

这是一个受欢迎的选择,但在我看来这是一个不错的选择。在大多数情况下,数据将以实体图层中存在的 1:1 呈现。


我建议使用配置良好的休眠分离实用程序,而不是视图模式中的会话或复制选项。

最新更新