2015-11-09 72 views
-1

我開始與Hibernate 4,在與AngularJS的Web項目中,我有一個典型的情況下,當你想與你一起使用你的實體Java類(Hibernate)在一種情況下,我需要添加兩個字段:鍵入名稱和用戶名顯示在前端,但這些字段在我的模型中的另一個表中,對象模板只有id(ManytoOne)。DTO的與休眠,前端對象與後端對象

這裏的問題是什麼,在這種情況下最好的做法是創建一個DTO或在你的類中添加這個新字段,但沒有與數據庫映射?

回答

0

我可能會推薦使用DTO。通過將字段添加到對象模型中,可以將模型與前端表示綁定,並且兩者可以分別進行增長和更改。

目前,只有一個視圖顯示此實體,但它可以更改,如果您使用實體的3個不同視圖,則必須添加到實體3種不同的方式來表示它同一個對象。

某些視圖可能需要很少的信息,而其他視圖可能需要更多信息。如果所有這些視圖都使用同一個對象,則所有信息都將被傳遞,而不管需求如何。

我會建議從其表示中解耦出商業模式。

+0

好吧,很好,現在的問題,將實體對象克隆到DTO,是否有任何庫來簡化這個過程,我在幾個後期的庫中看到了:lambdaj,dozer,Commons BeanUtils,你最喜歡什麼這個任務? – Miofino

+0

您覺得信息將會很常見和共享,一個好的做法是創建界面來表示您的DTO。我不知道那些圖書館lambdaj,推土機。 BeanUtils可以用來做反射,但是當你不得不重構時它可能會非常棘手。只需創建一個類MyObjectForThisView,它將構造函數中的對象作爲參數,並只提取有用的信息。 –

+0

最受歡迎的圖書館是Orika和Dozer。我更喜歡使用Orika(https://github.com/orika-mapper/orika),因爲它非常可定製,比Dozer更快,易於使用和配置,而且不使用xml。他們的指導非常明確和有幫助(http://orika-mapper.github.io/orika-docs/)。另外,如果你想將它與Spring很好地整合,這裏有一個方法(https:// github。COM/dlizarra/orika彈簧集成)。 –

0

以我的觀點來看,我相信你最好從程序的客戶端隱藏你的域模型(比如你的實體對象)。一般情況下,您最好只從存儲庫訪問您的域,即使您的服務無法直接訪問您的域模型對象。 (在MVC範例中)。所以在最後我想還是你在你的服務器做一個DTO並將其發送到您的客戶端

+0

好,非常感謝答案Kaveh – Miofino

1

我更喜歡使用DTO的:

  • 數據庫層(你的資料庫或DAO的)獲取並返回只有模型實體。
  • 服務層只獲取並返回DTO。

所以服務層負責將DTO映射到實體,反之亦然。

這將數據庫模型的視圖分離出來,並且在從服務器向客戶端發送數據時提供了更多的靈活性。

將DTO映射到實體中會生成很多代碼,但最終它往往會得到回報。你可以使用像OrikaDozer這樣的庫來幫助你。