2010-10-25 16 views
4

實體是直接映射到我們的數據庫(我們用於Hibernate)的類。實體,服務類和命令對象的最佳實踐問題

在調用DAO之前,我們的服務類包含與這些實體的業務邏輯。

我們也有命令對象,它們是與特定視圖相關的POJO。我被告知實體本身不應該被用作命令對象,但是我爲「爲什麼」給出的答案是不夠的。我希望這裏有人能給我這個答案。

我們的一些觀點非常簡單。他們沒有比實體本身更多的屬性。對我來說,將一個實體映射到一個基本上是實體鏡像的命令對象似乎毫無意義。

回答

1

看來您的對象的命名可能存在一些混淆。命令對象通常提供一個execute()方法(帶有參數),該方法對給定的實體或域對象進行操作,以根據業務邏輯改變其狀態。這是將業務邏輯封裝成簡單對象的一種非常簡潔的方式,它具有非常有限的範圍來改變其他對象。

因此,看起來您正在使用的設計實際上在數據傳輸對象(DTO或實體)和值對象(系統中的VO或Command對象)之間執行某種連接。這可能是非常浪費的,因爲你所做的只是將相同的數據複製到不同的對象中。

作用於數據傳輸對象(DTO或實體)模式的數據訪問對象(DAO)已經建立並且促進了圖層之間的良好分離。通常情況下,Hibernate會將實體映射到數據庫,並在其中延遲加載集合。這是大多數設計絆倒的地方,因爲它們不允許對集合進行正確的初始化,因爲一旦執行線程離開DAO,會話就會消失。我認爲JSP中的「命令對象」實際上是具有通過Hibernate查詢初始化的各種集合的實體的子集。

我建議你贊成適當地初始化實體這將簡化您的設計在某一個方面,但在另一個打開你到一個潛在問題的溝「命令對象」。您需要認真控制集合如何被JSP引用和初始化。您可能會發現自己必須查看Open Session In View模式,以確保當JSP調用某個尚未初始化的DTO上的getCollection()方法時,Hibernate Session對象可用。

1

在應用程序的所有層(控制器,視圖,服務類和DAO層)中,我看到在重新使用域模型對象(您正在調用實體)中沒有問題。這是你經常看到的常用設計。

沒有與此當且僅當你有層的真正分離沒有問題 - 控制器得到從服務層的模型對象,服務層從DAO層等

得到的模型對象

如果您有一種設計,您可以通過從視圖層調用manager.getEmployees()從數據庫加載Employee對象,那麼這將無法正常工作。