使用复杂对象Graph进行Hibernate Lazy加载

时间:2014-11-16 13:16:14

标签: hibernate lazy-loading

我有一个像

这样的实体结构
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 ??或者我是否在传递到其他级别之前手动遍历它,任何方法/最佳实践?

谢谢。提前

1 个答案:

答案 0 :(得分:0)

使用Hibernate Detach Utility

你需要的是一个&#39; Hibernate Detach Utility&#39;,就像这里一样:

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

这会使所有未初始化的集合归零。

使用视图模式中的会话

或者您可以在视图中使用所谓的会话&#39;图案。这样可以在您的视图中打开Hibernate会话。例如,如果您将数据从REST Web服务返回为json,则视图将是呈现json的代码。

将数据复制到表示层

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

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

我建议在视图模式会话中使用配置良好的Hibernate Detach Utility,或者复制选项。