[英]Should I iterate over hibernate collections to find an entity, or use criteria
這有什么約定? 例如,我有以下內容,其中一個項目的出價只能是一個項目的出價:
public class Item {
@OneToMany(mappedBy="item", nullable="false"
Set<ItemBid> itemBids = new HashSet<ItemBid>()
}
如果給了我項目投標人的名稱(存儲在ItemBid中),則IA)使用Club dao加載俱樂部,並遍歷其itemBids的集合,直到找到具有我想要的名稱的投標人,或B)創建在標准或HQL中使用俱樂部和項目投標名稱的ItemBid區域。
我認為B)對於非常大的收藏集將是最有效的,因此這是從大收藏集中檢索非常具體的項目的標准嗎? 如果是這樣,我可以就應該使用這些集合的哪些原因以及什么時候應該使用DAO的/條件制定一個一般性指南嗎?
是的,您絕對應該直接查詢出價。 以下是准則:
當然,從面向對象的角度來看,您應該始終使用集合(最好在Item
內部使用findBy*()
方法訪問內部出價集合)-這也更加方便。 但是,如果每個項目的投標數量很大,則加載(甚至是延遲加載)的成本也會很大,並且您很快就會用完內存。 這種方法也很浪費。
您應該早點問自己這個問題:在進行映射時。 映射ORM應該是一項明智的工作,而不是將所有外鍵都復制到雙方屬性上的問題。 (如果僅是因為YAGNI,但還有許多其他很好的理由)
可能的是,出價項目映射最好是單向的(然后,也許不是)。
在許多情況下,我們發現某些實體與幾乎固定數量的某些其他實體緊密關聯(在DDD中,它們可能被稱為“聚合”)。 例如發票和發票項目。 或一個人和他的愛好清單。 或一個帖子和該帖子的一組標簽。 我們預計給定發票中的項目數不會隨時間增加,標簽的數目也不會隨時間增加。 因此,它們都是映射@OneToMany的好地方。 另一方面,每個客戶的發票數量將不斷增長-因此我們只需要映射來自客戶的單向@ManyToOne發票-並進行查詢。
進行查詢的存儲庫(daos,無論如何)都是非常好的OO(查詢沒有問題;它只是一個以與存儲無關的方式描述您的需求的對象); 在實體中使用查找器-並非如此。 從實際的角度來看,它將實體綁定到數據訪問層(DAO甚至JPA類),這將使它們在許多用例(GWT)中無法使用,或者在分離時很難使用(您必須猜測哪些方法可以在外部使用)會話)。 從哲學的角度來看-它違反了單一責任原則,並將您的JPA實體更改為一種主動記錄的想去的人。
所以,我的答案是:
考慮它的最簡單方法是:如果您認為某些集合永遠不會與分頁一起顯示(例如帖子上的標簽,發票上的項目,個人興趣),則使用@OneToMany進行映射並將其作為集合進行訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.