我有一个像
这样的实体结构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
问题是在获取数据时hibernate为所有延迟加载的Collectio创建代理(持久包)。我根据用户需求提供数据,并且我无法控制用户在单个呼叫中需要更深入的数据。我需要的是使其他用户不需要的其他收集袋成为null如果我不这样做,它会给我关于POGO到DTO转换的所有数据,如果我从会话中分离它,它给了我在映射/ JSON转换期间的惰性初始化异常,是否有任何方法使其为null我的实体POGO ??或者我是否在传递到其他级别之前手动遍历它,任何方法/最佳实践?
谢谢。提前
答案 0 :(得分:0)
你需要的是一个&#39; Hibernate Detach Utility&#39;,就像这里一样:
这会使所有未初始化的集合归零。
或者您可以在视图中使用所谓的会话&#39;图案。这样可以在您的视图中打开Hibernate会话。例如,如果您将数据从REST Web服务返回为json,则视图将是呈现json的代码。
另一种可能性是您遍历代码中的对象图,并将要返回的内容复制到单独的值对象表示层中。可能有一些工具可以帮助自动执行某些复制。
这是一个很受欢迎的选择,但在我看来这是一个不错的选择。在大多数情况下,数据将以实体层中的1:1呈现。
我建议在视图模式会话中使用配置良好的Hibernate Detach Utility,或者复制选项。