簡體   English   中英

我應該遍歷休眠集合以查找實體還是使用條件

[英]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*()方法訪問內部出價集合)-這也更加方便。 但是,如果每個項目的投標數量很大,則加載(甚至是延遲加載)的成本也會很大,並且您很快就會用完內存。 這種方法也很浪費。

  1. 您應該早點問自己這個問題:在進行映射時。 映射ORM應該是一項明智的工作,而不是將所有外鍵都復制到雙方屬性上的問題。 (如果僅是因為YAGNI,但還有許多其他很好的理由)

  2. 可能的是,出價項目映射最好是單向的(然后,也許不是)。

  3. 在許多情況下,我們發現某些實體與幾乎固定數量的某些其他實體緊密關聯(在DDD中,它們可能被稱為“聚合”)。 例如發票和發票項目。 或一個人和他的愛好清單。 或一個帖子和該帖子的一組標簽。 我們預計給定發票中的項目數不會隨時間增加,標簽的數目也不會隨時間增加。 因此,它們都是映射@OneToMany的好地方。 另一方面,每個客戶的發票數量將不斷增長-因此我們只需要映射來自客戶的單向@ManyToOne發票-並進行查詢。

  4. 進行查詢的存儲庫(daos,無論如何)都是非常好的OO(查詢沒有問題;它只是一個以與存儲無關的方式描述您的需求的對象); 在實體中使用查找器-並非如此。 從實際的角度來看,它將實體綁定到數據訪問層(DAO甚至JPA類),這將使它們在許多用例(GWT)中無法使用,或者在分離時很難使用(您必須猜測哪些方法可以在外部使用)會話)。 從哲學的角度來看-它違反了單一責任原則,並將您的JPA實體更改為一種主動記錄的想去的人。

所以,我的答案是:

  • 如果您需要一個出價,請直接查詢,
  • 如果您要顯示給定項目的所有出價-提取項目並使用集合。 這不取決於每個項目的出價數量,因為JPA執行的查詢與您自己執行的查詢相同。 如果此方法需要調整(例如,在您需要提取很多項目並希望避免出現“ N + 1選擇問題”的情況下),則可以使用多種方法(加入提取,渴望獲取,提示)正確,而無需更改使用getBids()的代碼部分。

考慮它的最簡單方法是:如果您認為某些集合永遠不會與分頁一起顯示(例如帖子上的標簽,發票上的項目,個人興趣),則使用@OneToMany進行映射並將其作為集合進行訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM