2016-10-20 53 views
1

我是JPA和多層體系結構編碼方式的新手。我正在製作一個新項目,我們正在製作一個API,其中使用DAO層來使用JPQL與數據庫進行通信。JPA - DAO層的延遲初始化

目前,我已經寫JPQL語句從數據庫中獲取數據。除此之外,我還執行延遲初始化來檢索複雜對象。我想知道在DAO層中執行延遲初始化是否正確。

我有前2層以上稱爲發動機層和在那裏我有數據庫連接活性,並且可以有執行延遲初始化以及EJB層DAO層。我想知道這是否是一種很好的體系結構方式,因爲我希望與DAO層相關的數據庫相關聯。

但同樣,我陷在其中,我認爲自己在說爲什麼沒有做延遲初始化在EJB /引擎層一個很好的方式,因爲我有數據庫連接積極進行DB操作的點。我正在考慮這種方式,因爲我只能檢索DAO層中可以重用的必要數據,並且可以根據不同類的需要執行延遲初始化。

我不知道爲什麼我有引擎數據庫連接有源和EJB層(我希望這是對事務管理)。它發現它是根據建築師的建議完成的,我將EJB定義爲無狀態,並且我的引擎級別類在其範圍內具有數據庫連接。

對不起,冗長的問題。希望我已經提供了必要的細節來回答這個問題。

P.S.請給我建議任何好的書或文章,這將幫助我決定哪一層負責理想地執行什麼任務。

+1

由於懶惰初始化的一點是要推遲實體的裝載,直至需要它們,我認爲將是做在最高層的,你仍然有'Session'或'Transaction'範圍(EJB在你的情況)。將它們加載到你的DAO中總會做到這一點,不管你是否真的需要它們,或者沒有達到懶惰的目的。我的$ 0.02。 – kjsebastian

+0

感謝回覆@conscells它可以在EJB層做數據庫檢索,當我們有DAO層專門做到這一點? – user1901761

+0

如果你使用Hibernate,它就像'Hibernate.initialize(parent.getChildRelation())'一樣簡單。所以像'if(userRequestedChild){Hibernate.initialize(...); } return parent;在我看來,在EJB層中可以做。 – kjsebastian

回答

1

我會說在DAO做是做正確的事。但要創建一個通用的單獨方法。例如,如果你有一個方法來獲取部門,像

public List<Department> getDepartments() { 
    //get departments 
    //Also fetch employees in each department here // DON'T DO 
} 

這將是很好,有特定的正確獲取所有實體和Java文檔它的另一種方法。

public List<Department> getDepartmentsWithEmployees() { 
    //get departments 
    //Also fetch employees in each department here  
} 

因此,人們會根據需要調用正確的方法,並降低出現任何性能問題的機率。

注意:如果可能,請使用聯合提取。