2013-03-13 12 views
3

我使用hibernate進行持久化。在我的數據訪問層中,我指定了根據場景急切加載的結果的某些部分。hibernate deproxy

現在我需要將這些結果作爲JAX WS響應發送。

有什麼辦法,我可以有這將需要一個實體對象,遍歷它的一些清潔方法,並設置null到未初始化這樣的話Hibernate就不會丟LazyInitializationException場當對象被傳遞到Web服務層。

或者有沒有其他方法可以解決這個問題。

+0

你見過[this](http://stackoverflow.com/questions/5800814/is-it-possible-to-detach-hibernate-entity-so-that-c​​hanges-to-object-are-not- AUT)? – mindas 2013-03-13 21:37:06

+0

使用DTO男子.... – Thihara 2013-06-28 08:29:49

回答

1

我在這裏有相同的體系結構,我們在業務層執行加載作業。沒有辦法自動執行此操作,因爲只要您知道ws響應中需要哪些數據。基本上,我有一種方法將實體模型(JPA映射)轉換爲簡單的POJO,反之亦然,並且在此方法中,我解析了需要加載哪個屬性。

你可以使用這樣的事情:

public interface IBusiness<Model, VO> { 

    public Model toModel(VO vo); 
    public VO toVO(Model model); 
    public List<Model> toModelList(List<VO> vos); 
    public List<VO> toVOList(List<Model> models); 

} 

您在業務層上實現了這個接口並解決問題懶加載的一切你在這個方法需要。

好運氣=)

+0

是的,正如你所說我解決了哪些屬性應該加載到我的數據訪問層。我想知道的是,是否有任何方法在通過Web服務發送它們之前自動'取消'未初始化的字段。 – janith 2013-03-13 15:02:15

+0

我喜歡你的方法順便說一句,你如何處理這樣一個場景: 在一種情況下,你有一個字段的一個子集初始化,在另一種情況下,一些其他的字段子集被初始化。 – janith 2013-03-13 15:05:16

+0

您可以使用Hibernate.initialize()加載未初始化的字段。但要小心......您必須調用此方法,使用未初始化字段而不是對象實例。 – 2013-03-13 15:21:25

0

替代方案可能不會使用惰性初始化。

如何做到這一點取決於你處理的情況。你會在SO上找到答案。

+0

不使用延遲加載不是一個選項。如果所有的關係都被急切加載,我最終會得到大量不必要的數據,這些數據在網絡上傳輸時將是一個重要的性能問題。 – janith 2013-03-13 14:47:59

+0

因此,我建議你在循環結束之前解決「由你自己」加載必要的數據。 =) – 2013-03-13 14:55:00

2

有作爲Hibernate#initialize()這樣的事情,你可以加載實體後運行活動會話,但它會在實體(或集合的根級別初始化場/引用),你已經通過 - 如果實體是Hibernate代理。正如JavaDoc所述:

注意:這隻能確保代理對象或集合的初始化; 不能保證INSIDE集合中的元素將被初始化/實現化爲 。

將NULL分配給未初始化的字段不是一個好方法,因爲它會破壞數據一致性(如果有人訪問這些字段,那麼它們應該返回實際值)。

1

如果你使用的是Spring,你可以使用OpenSessionInView(Interceptor | Filter)。這對於延遲初始化異常很簡單,因爲它將會話邊界與請求邊界對齊。我通常不喜歡這種方法,因爲它通過對代理數據的數據庫進行附加查詢來消除錯誤。

我的偏好在您的情況下是使用具有您感興趣的特定字段的傳輸對象。沒有必要往返發送數據,或者更糟糕的是,發送的數據錯誤地表示持久層的實際狀態。

我實際上會更進一步,讓您的會話邊界保持原樣,並確保您的DAO方法返回傳輸對象而不是實體。人們經常會爭辯說,實體只是POJO,而這只是更多的工作。但事實是,正如你的問題所說明的那樣,試圖將實體作爲POJO對待可能導致隱式數據訪問,這屬於專用於數據訪問的層。

+0

我不使用spring,「人們經常會爭辯說實體只是POJO,而這只是更多的工作」這正是我之所以沒有初步考慮DTO的原因。但正如你所指出的那樣,使用DTOs將是一個很好的解決方案。你能指點我的任何設計模式/優雅的方式來處理實體的轉換 - > DTO – janith 2013-03-13 15:11:54

+0

我不確定OpenSessionInView過濾器將在這種情況下工作。 – 2013-03-13 15:26:53

+1

當您考慮實體嵌套,集合和類型轉換(DTO中的關係通常由原始PK字段而不是完整實體表示)時,解決這個問題非常困難。也許像Dozer(http://dozer.sourceforge.net/)這樣的東西可以幫助你獲得大部分的途徑。 – Jeff 2013-03-13 15:28:02