2010-04-10 109 views
2

我在使用Hibernate的數據庫項目的兩種設計之間猶豫。關於使用休眠時的數據對象和DAO設計

設計#1。 (1)創建一個通用數據提供者接口,其中包括一組DAO接口和一般數據容器類。它隱藏了下面的實現。數據提供者實現可以訪問數據庫中的數據,XML文件,服務或其他內容。數據提供者的用戶不知道它。

(2)用Hibernate創建一個數據庫庫。這個庫實現了(1)中的數據提供者接口。

設計#1的壞處是爲了隱藏實現細節,我需要創建兩組數據容器類。一個在通用數據提供者接口中 - 我們稱它們爲DPI對象,另一組用於數據庫庫中,專用於Hibernate中的實體/屬性映射 - 我們稱之爲H對象。在DAO實現中,我需要從數據庫讀取數據以創建H對象(通過Hibernate),然後將H對象轉換爲DPI對象。

設計#2。

請勿創建通用數據提供者接口。將H對象直接公開給使用數據庫庫的組件。所以數據庫庫的用戶需要了解Hibernate。

我更喜歡design#1,但我不想創建兩組數據容器類。這是從使用基於數據庫的數據提供者的用戶中隱藏H-Objects和其他Hibernate實現細節的正確方法嗎?

設計#2是否有任何缺點?我不會在未來實現其他數據提供者,所以我應該忘記數據提供者接口並使用Design#2?

您對此有何看法?謝謝你的時間!

回答

0

我強烈建議閱讀Spring in Action, 3rd edition的第4章「命中數據庫」,即使在應用程序中沒有使用Spring也是如此。儘管我的第二個建議是使用Spring :-)

DAO模式是將數據庫和ORM邏輯隔離在DAO實現中的好方法,並且您只需要一組實體對象。沒有Spring,你可以做到這一點,只需要更多的工作來管理會話和事務。

如果我理解你的文章,這是設計1和設計2之間的中間地帶.H對象(Hibernates加載並保持的實體)根本不需要任何Hibernate特定的代碼。這使得它們完全可以被用作DPI對象。

我曾與過去的人抱怨說,使用JPA或Hibernate Annotations通過DAO接口公開Hibernate細節。我個人採取更務實的觀點,因爲註釋僅僅是元數據,並且不要直接影響你的實體類的操作。

如果你確實認爲註釋暴露得太多,那麼你可以去舊學校,並使用Hibernate Mappings來代替。然後你的H對象是100%休眠免費:-)

+0

謝謝你的答案,戴夫。這似乎是最廣泛採用的方法。正如我在答覆John的回答時所說的,這種方法的一些問題讓我感到困擾。無論如何,我想我會在尋找完美解決方案時使用它。 :) – evergreen 2010-04-12 19:50:35

0

我推薦設計#2。簡單地構造域對象,並讓hibernate照看它們。不要編寫持久化的單獨的類。

Hibernate試圖隱藏大部分持久性業務。你可能需要添加一些小的註釋到你的實體來幫助它。但肯定不要分開上課。

您可能需要一些非常小的DAO類。例如,如果您有一個Person實體,那麼通常會有一個PersonDAO對象來保存一個人。話雖如此,DAO中的代碼將非常簡單,所以對於一個非常小的項目來說,它可能不值得。對於大型項目,如果您想稍後使用不同的持久性技術,可能需要將持久性代碼與業務邏輯分開。

+0

我有幾個關於將域對象直接映射到休眠。 (1)如果我想使用註釋,我需要將Hibernate註釋放在域對象中,但這些域對象在系統中的許多其他組件中都使用。我不認爲域對象的用戶應該在代碼中看到Hibernate特定的東西。 (2)H對象和域對象之間的衝突。例如,一些H對象需要「id」字段,但域對象不需要。 H對象需要getter/setter,但域對象可以包含所有「final」字段。 – evergreen 2010-04-10 04:07:22

1

Hibernate Domain對象是簡單的POJO,因此您不必創建單獨的DPI對象,H對象本身可以直接使用。在DAO中,您可以控制它們是來自休眠還是其他任何東西。

+0

同意。我總是添加一個複製構造函數到我的數據對象,使事情變得更容易。 – 2010-04-10 17:01:13