编程语言
首页 > 编程语言> > java-“非网络” Spring应用程序中的Hibernate LazyInitializationExceptioin

java-“非网络” Spring应用程序中的Hibernate LazyInitializationExceptioin

作者:互联网

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

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

我已经谈过使用OpenSessionInViewFilter的问题,但是没有涉及不使用servlet的应用程序…
哪个是解决问题的正确方法?

解决方法:

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

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

> Hibernate.initialize()

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

SELECT order FROM订单订单加入获取订单.orderDetail

更新:

@OneToMany上的fetch = FetchType.EAGER是第三个选项.这将导致如果订单被加载,其orderDetail也将被自动加载和初始化.但这会全局影响.我们通常不会更改默认的@OneToMany懒惰获取计划,以便急于获取映射元数据,除非绝对确定要这样做.取而代之的是,我们使用访存联接(选项2)来覆盖默认的懒惰访存计划,以针对特定的用例急切地进行访存.

标签:hibernate,lazy-loading,spring,java
来源: https://codeday.me/bug/20191101/1983860.html