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