2013-07-04 28 views
0

環境做:Hibernate的建模和抓取策略:做什麼用的信息疏小件

  • 的Java
  • MVC模式
  • 休眠

說明

好吧,讓我們說我有兩個域對象的Web應用程序:

  • 用戶
  • 報告

用戶可以有很多報告的(一對多關係)。請認爲報告是一個非常複雜的對象,具有很多屬性。

用戶等級:

public class User { 
    private Set<Report> reports = new HashSet<Report>(); 
} 

報告類:

public class Report { 
    //...so maaaaaaany attributes 
    private String name; 
} 

比方說,我需要證明顯示與關聯的報告的列表中的用戶配置文件的HTML頁面。只有報告的名稱出現在列表中。請評論這些注意事項:

  1. 我不認爲因爲內存保存問題而急於加載報告,所以我會懶惰。
  2. 即使我懶惰,重點是我實際上只需要報告的名稱。我不想加載大量信息來挑選報告名稱!

因此,一個可能的解決方案是修改用戶類,如下所示:

public class User { 
    private Set<Report> reports = new HashSet<Report>(); 
    private List<String> reportNames; 
} 

採取從給用戶的報告所需的信息。在我看來,它帶來兩個後果:

  1. 報告名稱列表必須保持更新
  2. 我打破對象域之間的間隔,填充信息,我不能輕易獲取用戶。這種方法甚至可能是有效的,但它非常難看。

那麼是否有一個很好的解決方案來解決這個問題?我認爲這對開發者來說是一個普遍問題。

回答

0

的一種方法是使用下面的模式:

  • 創建代表究竟要顯示什麼視圖對象,姑且稱之爲UserViewObject。我會而不是修改域對象只是爲了適應它們的視圖,這將打破MVC設計。

  • 在返回列表UserViewObject的服務類中實現了一個服務方法。

  • 讓服務方法調用實際完成該工作的DAO類中的DAO方法。

DAO方法可以確保只讀取所需的數據,或者您可以在服務層中執行該轉換。它實際上是你喜歡的一部分,以及它如何適應。但是不要讓DAO層知道你的UserViewObject

+0

也許我的問題隱藏了更深刻的見解。您的接受肯定是有道理的,但事實證明,要高效靈活地管理對象,需要手動干預。通過這樣做,在我看來,Hibernate不適合真正的問題,因爲開發人員必須自己編寫查詢。換句話說,如果Hibernate不能支持具有類似問題的開發人員讓他們編寫查詢,那麼是否值得使用它? – MaVVamaldo

+0

如果你有一個真正被設置爲懶惰的模型,HQL有很好的支持。這可以讓你調整從對象中獲取哪些屬性。有時Hibernate會查詢數據庫太多,但我認爲這些問題大部分可以通過一些配置和定義好的模型來避免。對於非常複雜的查詢,請使用原生SQL(JPA/Hibernate也支持這一點)。 – Magnilex

+0

老實說,我在每個渴望獲取的地方閱讀都是像世界上最糟糕的東西一樣避免,所以我設法在我的web應用程序中啓用延遲加載。但我認爲懶加載遠非一般的解決方案。粗略地說,我會說:EAGER =>內存消耗:(最小查詢數量:) LAZY =>內存保存:);嚴重的查詢數量:(所以你只需要選擇你的毒藥 – MaVVamaldo