2012-07-31 83 views
2

我正在開發一個使用SpringMVC,JPA2的簡單論壇Web應用程序。 我創建了像用戶,論壇,發佈等反映數據庫表結構的JPA實體。DTOs更好的方法?

但同時顯示UI上的數據,我需要一些DTOs,我不能總是抱着要顯示在使用實體UI中的數據。

例如:更改密碼畫面。在這裏我需要保留舊密碼,新密碼和確認新密碼。但用戶實體不會有舊/新/確認密碼字段,它只是密碼。所以我需要創建DTO,它們只是Web和服務層之間的數據載體。

我的問題是在創建DTO的對象,應該我把所有的DTO本身或包裝在DTO實體,並添加額外的屬性所需要的屬性?

例:對於編輯用戶界面,

public class UserDTO 
{ 
    private User user; // User is a JPA entity 
    // setters & getters 
} 

有了這個,我可以通過底層的用戶實體到我的業務層。但在綁定UI屬性到DTO時,我需要關聯PropertyEditor。

(或)

public class UserDTO 
{ 
    private String userId; 
    private String userName; 
    private String password; 
    // setters & getters 
} 

用這種方法,我需要轉換&複製DTO的屬性分爲JPA實體,並傳遞給服務層。

哪種方法更好?還是有沒有其他方法完全沒有DTO?

回答

0

你的第一途徑仍然帶有實體對象本身的表示層。如果您有其他參數不是來自數據庫,並且您的持久性上下文仍然可用,那麼這種方法就足夠了。

第二種方法需要的代碼,這是不理想的重複。

如果持久化上下文是不可用的,我會建議使用EntityManager.detach(從持久化上下文中分離的實體),而不是創建豆的並行層次。另一方面,如果數據從表示層進入,則需要從數據庫(使用find()或類似的東西)加載實體並更新它,或將它合併()成持久性上下文。

+0

但對於像更改密碼屏幕或後的屏幕顯示列表中的場景與一些聚集results..here我們需要DTOs..right對象? – 2012-07-31 05:43:25

+0

爲什麼?如果您只需要實體中的一部分數據(您已從數據庫中提取數據),那麼使用整個實體不會有任何額外開銷。如果您還需要其他實體,則可以加載它們並將它們攜帶到表示層。 – 2012-07-31 05:56:22

+0

對於DataGrid,我必須顯示1到25條記錄(實體),保留當前頁面的內容,總共有多少頁面等等。而不是將所有這些細節存儲爲請求(不管)範圍中的單個參數,我認爲將它們存儲在DTO中會更好。 – 2012-07-31 06:01:11