簡體   English   中英

Hibernate “非網絡”應用程序中的 LazyInitializationExceptioin Spring

[英]Hibernate LazyInitializationExceptioin in a "non-web" Spring application

我在控制台應用程序中使用 Spring 3.1 和 Hibernate 4(我正在嘗試這些框架的一些功能及其集成)。

如何在非網絡應用程序中解決 Hibernate LazyInitializationExceptioin

我對使用OpenSessionInViewFilter很感興趣,但對不使用 servlets 的應用程序卻一無所知……哪種方法是解決問題的正確方法?

在將 hibernate 加載的實例返回到您的控制台應用程序的視圖層之前,請始終確保您需要在視圖層中顯示或訪問的實體已初始化。

您可以使用以下方法強制初始化實體:

  1. Hibernate.初始化()

    例如,您必須在視圖層中顯示一個Order的所有orderDetail ,但您的控制台應用程序只加載一個order實例。 假設orderDetail是延遲加載的,在將order返回給視圖層之前,調用Hibernate.initialize(order.getOrderDetail())

  2. 使用fetch join獲取orderDetail以及導致返回的order object 的orderDetail完全初始化的order

    SELECT order FROM Order order join fetch order.orderDetail


更新:

@OneToMany上的fetch = FetchType.EAGER是第三個選項。 會導致如果加載了一個order ,它的orderDetail也會自動加載並初始化。但是這是全局影響的。 我們通常不會將@OneToMany的默認延遲獲取計划更改為急切獲取映射元數據,除非它絕對確定要這樣做。 相反,我們使用fetch join (選項 2)來覆蓋默認的惰性獲取計划,以便為特定用例急切獲取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM