我有一个实体结构,
如下所示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 呈现。
我建议使用配置良好的休眠分离实用程序,而不是视图模式中的会话或复制选项。