我在控制台应用程序中使用Spring 3.1和Hibernate 4(我正在尝试这些框架及其集成的某些功能)。
如何在非Web应用程序中解决Hibernate LazyInitializationExceptioin
?
我对使用OpenSessionInViewFilter
感到不满,但对于不使用servlet的应用程序却没有。
哪个是解决问题的正确方法?
最佳答案
在将由hibernate加载的实例返回到控制台应用程序的视图层之前,请始终确保已初始化需要在视图层中显示或访问的实体。
您可以使用以下方法强制初始化实体:
例如,您必须在视图层中显示
orderDetail
的所有Order
,但是您的控制台应用程序仅加载order
实例。假设orderDetail
是延迟加载的,在将order
返回到视图层之前,请调用Hibernate.initialize(order.getOrderDetail())
orderDetail
以及order
,这会使返回的order
对象的orderDetail
完全初始化:从订单订单中选择SELECT订单加入订单。orderDetail
更新:
fetch = FetchType.EAGER
上的@OneToMany
是第三个选项。如果加载了order
,也会导致其orderDetail
也自动加载和初始化,但这会全局影响。除非绝对确定,否则我们通常不将@OneToMany
的默认懒惰获取计划更改为急于获取映射元数据。取而代之的是,我们使用fetch join
(选项2)来覆盖默认的懒惰获取计划,以针对特定的用例急切地获取它。