我在控制台应用程序中使用Spring 3.1和Hibernate 4 (我正在尝试这些框架及其集成的一些功能)。
如何解决非网络应用中的Hibernate LazyInitializationExceptioin
?
我对使用OpenSessionInViewFilter
感到兴奋,但没有关于不使用servlet的应用程序...
哪种方法可以解决问题?
答案 0 :(得分:4)
在将hibernate加载的实例返回到控制台应用程序的视图层之前,请始终确保初始化需要在视图层中显示或访问的实体。
您可以使用以下方法强制初始化实体:
例如,您必须在视图层中显示orderDetail
的所有Order
,但您的控制台应用程序仅加载order
实例。假设orderDetail
延迟加载,在将order
返回到视图图层之前,请调用Hibernate.initialize(order.getOrderDetail())
使用fetch join获取orderDetail
以及order
,这会导致返回的order
对象的orderDetail
完全初始化:< / p>
SELECT order FROM Order order join fetch order.orderDetail
更新:
fetch = FetchType.EAGER
上的 @OneToMany
是第3选项。这将导致如果加载order
,其orderDetail
也将自动加载并初始化。但这会影响全局。我们通常不会将@OneToMany
的默认延迟获取计划更改为在映射元数据中急切获取,除非绝对确定这样做。相反,我们使用fetch join
(选项2)覆盖默认的懒惰获取计划,以便针对特定用例急切地获取。