環境做:Hibernate的建模和抓取策略:做什麼用的信息疏小件
- 的Java
- 春
- MVC模式
- 休眠
說明:
好吧,讓我們說我有兩個域對象的Web應用程序:
- 用戶
- 報告
用戶可以有很多報告的(一對多關係)。請認爲報告是一個非常複雜的對象,具有很多屬性。
用戶等級:
public class User {
private Set<Report> reports = new HashSet<Report>();
}
報告類:
public class Report {
//...so maaaaaaany attributes
private String name;
}
比方說,我需要證明顯示與關聯的報告的列表中的用戶配置文件的HTML頁面。只有報告的名稱出現在列表中。請評論這些注意事項:
- 我不認爲因爲內存保存問題而急於加載報告,所以我會懶惰。
- 即使我懶惰,重點是我實際上只需要報告的名稱。我不想加載大量信息來挑選報告名稱!
因此,一個可能的解決方案是修改用戶類,如下所示:
public class User {
private Set<Report> reports = new HashSet<Report>();
private List<String> reportNames;
}
採取從給用戶的報告所需的信息。在我看來,它帶來兩個後果:
- 報告名稱列表必須保持更新
- 我打破對象域之間的間隔,填充信息,我不能輕易獲取用戶。這種方法甚至可能是有效的,但它非常難看。
那麼是否有一個很好的解決方案來解決這個問題?我認爲這對開發者來說是一個普遍問題。
也許我的問題隱藏了更深刻的見解。您的接受肯定是有道理的,但事實證明,要高效靈活地管理對象,需要手動干預。通過這樣做,在我看來,Hibernate不適合真正的問題,因爲開發人員必須自己編寫查詢。換句話說,如果Hibernate不能支持具有類似問題的開發人員讓他們編寫查詢,那麼是否值得使用它? – MaVVamaldo
如果你有一個真正被設置爲懶惰的模型,HQL有很好的支持。這可以讓你調整從對象中獲取哪些屬性。有時Hibernate會查詢數據庫太多,但我認爲這些問題大部分可以通過一些配置和定義好的模型來避免。對於非常複雜的查詢,請使用原生SQL(JPA/Hibernate也支持這一點)。 – Magnilex
老實說,我在每個渴望獲取的地方閱讀都是像世界上最糟糕的東西一樣避免,所以我設法在我的web應用程序中啓用延遲加載。但我認爲懶加載遠非一般的解決方案。粗略地說,我會說:EAGER =>內存消耗:(最小查詢數量:) LAZY =>內存保存:);嚴重的查詢數量:(所以你只需要選擇你的毒藥 – MaVVamaldo