2011-11-08 90 views
1

我有一個關於使用Hibernate註釋和DAO模式的設計問題。 DTO應該表示數據模型的實體。 DAO是定義這些DTO操作的接口。 DAO實現是實現DAO接口的類,並實現由這些接口定義的操作(例如使用Hibernate/MySQL)。 我的問題是:如何在這種情況下使用Hibernate註釋?如果我直接註釋DTO,我將DTO與Hibernate框架結合起來,這是我認爲不好的做法。Hibernate註釋和DTOs

也許這是一個簡單的問題,但問題很有趣。

謝謝

回答

1

這是一個問題或假設「獨立」與易用性。要麼選擇使用Hibernate或其他JPA引擎,而且確實需要在實體上註釋並在類路徑中使用hibernate jar來使用它們。或者您選擇完全獨立於JPA/Hibernate,但您必須自己實現整個持久性。

我的觀點是,犧牲JPA提供的易用性和工作效率只是爲了避免類路徑中的某些jar是不好的選擇。但是YMMV。

+0

我在想一個項目可以專用於未註釋的DTO和DAO接口。另外還有一個專門用Hibernate的XML映射文件來實現DAO的項目。所以,DAO接口和DTO完全獨立於特定的實現。在這種情況下,您認爲使用Hibernate的XML映射文件是最佳實踐嗎? –

+0

Hibernate不使用DTO。它使用實體。一旦你從Hibernate會話中獲得一個實體,它就會保持連接到會話,並且你應用到實體的所有更改都會自動在數據庫中持久化,而不需要調用任何DAO.update()方法。從一個實體到另一個實體的所有關聯都會通過導航到對象圖形而自動加載。您可能會將這些實體分離出來(從而使它們成爲DTO),但是這會讓JPA非常有用,從而失去了很大一部分內容。 –

+0

我從你的評論中瞭解到,DAO模式和Hibernate是「不兼容的」。因爲我們可以通過Hibernate的方法更新實體,所以在這種情況下我們不需要使用DAO? –

0

如果我正確理解你,DTO是Hibernate和你的數據庫表之間的對象關係映射,如果是這種情況,我相信你最好有你的DTO對象註釋。

1

當您使用從javax.persistence包註釋你與Hibernate連接你的代碼(但是你會使用org.hibernate作爲註解的時候,因爲它們依賴於第三方庫)。

請注意,註釋只是元信息不會影響您的設計(您不強制類來實現像接口一樣的方法),只是爲了某些目的使用附加信息註釋它們。

只要註釋屬於標準化java api(本例中爲javax.persistence),註釋類的客戶端就不會被迫將其代碼與其他依賴項耦合在一起。

+1

是的,但如果我使用javax.persistence包,我將代碼耦合到JPA,並且有不使用JPA和Hibernate的DAO實現。我的想法是讓DTO完全獨立於特定的實現。你怎麼看? –

+1

如果完全解耦任何代碼(甚至是JPA)是您的首要任務,請使用hibernate XML映射。他們比較冗長,不太舒服(至少對我來說),但是符合你的要求。但請記住,註釋在這裏只是爲了簡單起見,所以你應該仔細考慮你的jpa耦合類是否會出現在非jpa項目中。 – Xorty

+0

好的,我明白我需要考慮我的DTO的未來。如果我們用來堅持它們的唯一方法是JPA/Hibernate,則可以使用註釋。否則,在Hibernate特定項目中使用XML映射會使映射配置更容易。 –

0

維基百科:

在傳統的EJB(企業JavaBeans)架構,DTO的雙重用途:首先,他們解決的是實體bean預EJB的問題3.0不能序列;其次,它們隱含地定義了一個彙編階段,在該階段中,在將控制權返回到表示層之前,將視圖所使用的所有數據提取並編入DTO中。使用DTO的第三個原因可能是應用程序的某些層不能訪問底層的數據訪問對象,從而更改數據。

因此DTO是由實體創建並由表示層使用的對象(JSP,例如應該直接訪問DTO-s而不是實體)。所以,你不應該註釋DTO-s而是你的實體類,然後提供代碼來將實體轉換爲DTO-s。

+0

所以在你的情況下,你有兩個Hibernate實體和DTO,都由類表示。當你想修改模型會發生什麼?你需要在DTOs層面和實體層面上工作兩次? –

+0

沒錯;請注意,在維基百科文章中引用的「傳統EJB(Enterprise JavaBeans)體系結構」的情況下,無論何時更改實體EJB,您還需要更改相應的DTO。 –