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

如何在非Web应用程序中解决Hibernate LazyInitializationExceptioin

我对使用OpenSessionInViewFilter感到不满,但对于不使用servlet的应用程序却没有。
哪个是解决问题的正确方法?

最佳答案

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

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

  • Hibernate.initialize():

    例如,您必须在视图层中显示orderDetail的所有Order,但是您的控制台应用程序仅加载order实例。假设orderDetail是延迟加载的,在将order返回到视图层之前,请调用Hibernate.initialize(order.getOrderDetail())
  • 使用fetch join来获取orderDetail以及order,这会使返回的order对象的orderDetail完全初始化:

    从订单订单中选择SELECT订单加入订单。orderDetail


  • 更新:
    fetch = FetchType.EAGER上的@OneToMany是第三个选项。如果加载了order,也会导致其orderDetail也自动加载和初始化,但这会全局影响。除非绝对确定,否则我们通常不将@OneToMany的默认懒惰获取计划更改为急于获取映射元数据。取而代之的是,我们使用fetch join(选项2)来覆盖默认的懒惰获取计划,以针对特定的用例急切地获取它。

    09-25 20:21