Hibernate LazyInitializationExceptioin在“非Web”Spring应用程序中

时间:2012-04-10 10:34:21

标签: java spring hibernate lazy-loading

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

如何解决非网络应用中的Hibernate LazyInitializationExceptioin

我对使用OpenSessionInViewFilter感到兴奋,但没有关于不使用servlet的应用程序... 哪种方法可以解决问题?

1 个答案:

答案 0 :(得分:4)

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

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

  1. Hibernate.initialize()

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

  2. 使用fetch join获取orderDetail以及order,这会导致返回的order对象的orderDetail完全初始化:< / p>

    SELECT order FROM Order order join fetch order.orderDetail


  3. 更新:

    fetch = FetchType.EAGER上的

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