我在控制台应用程序中使用 Spring 3.1 和 Hibernate 4(我正在尝试这些框架的一些功能及其集成)。
如何解决非网络应用程序中的 Hibernate LazyInitializationExceptioin
?
我对使用 OpenSessionInViewFilter
很感兴趣,但对不使用 servlet 的应用程序一无所知...
哪种方法才是解决问题的正确方法?
最佳答案
在将 hibernate 加载的实例返回到控制台应用程序的 View 层之前,请始终确保您需要在 View 层中显示或访问的实体已初始化。
您可以使用以下方法强制初始化实体:
-
例如,您必须在 View 层中显示一个
Order
的所有orderDetail
,但您的控制台应用程序只加载一个order
实例。假设orderDetail
是延迟加载的,在将order
返回给 View 层之前,调用Hibernate.initialize(order.getOrderDetail())
使用 fetch join获取
orderDetail
以及order
导致返回的order
对象的orderDetail
完全初始化:SELECT order FROM Order order join fetch order.orderDetail
更新:
@OneToMany
上的 fetch = FetchType.EAGER
是第三个选项。这会导致如果加载了一个order
,它的orderDetail
也会被自动加载和初始化。但这会影响全局。我们通常不会将 @OneToMany
的默认延迟获取计划更改为急切获取映射元数据,除非它绝对确定要这样做。相反,我们使用 fetch join
(选项 2)来覆盖默认的延迟获取计划,以便为特定用例急切获取。
关于java - "non-web"Spring 应用程序中的 Hibernate LazyInitializationExceptioin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087114/