3

我在控制台应用程序中使用 Spring 3.1 和 Hibernate 4 (我正在尝试这些框架的一些功能及其集成)。

如何LazyInitializationExceptioin非 Web 应用程序中解决 Hibernate 问题?

我对 using 感到不满OpenSessionInViewFilter,但对不使用 servlet 的应用程序却一无所知...解决问题的正确方法是什么?

4

1 回答 1

4

在将 hibernate 加载的实例返回到控制台应用程序的视图层之前,请始终确保您需要在视图层中显示或访问的实体已初始化。

您可以使用以下方法强制初始化实体:

  1. Hibernate.initialize()

    例如,您必须在视图层中显示所有的 orderDetailOrder但您的控制台应用程序只加载一个order实例。假设 orderDetail是延迟加载,在返回order视图层之前,调用 Hibernate.initialize(order.getOrderDetail())

  2. 使用fetch 连接来获取orderDetail以及order导致返回的order对象orderDetail完全初始化:

    SELECT order FROM Order order join fetch order.orderDetail


更新 :

fetch = FetchType.EAGER@OneToMany是第三个选项。这将导致如果 aorder被加载,它orderDetail也将被自动加载和初始化。但这会影响全局。我们通常不会将默认的惰性获取计划更改为@OneToMany在映射元数据中急切获取,除非绝对确定这样做。相反,我们使用fetch join(选项 2)来覆盖默认的延迟获取计划,以便为特定的用例急切地获取。

于 2012-04-10T11:00:51.853 回答