簡體   English   中英

Hibernate 中的延遲加載和 collections

[英]Lazy loading and collections in Hibernate

如果我想從延遲加載的集合中獲取單個或少量項目(例如,第一個、第三個和第五個),Hibernate 會從數據庫中獲取所有項目,然后返回我請求,或者它將專門從數據庫中僅檢索請求的請求

看看超懶 collections

但是,如果您需要特定項目,只需查詢它們而不是從集合中獲取它們。

額外懶惰的替代方法是使用 Collection 過濾器http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-filtering

這基本上是基於集合內容的查詢。 這包括分頁的可能性。

Collection tenKittens = session.createFilter(
    mother.getKittens(), "")
    .setFirstResult(0).setMaxResults(10)
    .list();
In hibernate, pagination doesn't work well when eagerly fetching a collection. 

在這種情況下,hibernate 獲取所有表數據而不進行分頁,並在 JVM 內應用 memory 分頁。 發生此警告時會打印:{code:java} [/api] WARN ohhiast.QueryTranslatorImpl - HHH000104: firstResult/maxResults specified with collection fetch; 在內存中應用! {代碼}

對於這些情況,我們至少應該提出一個拉取請求,以選擇性地拋出 RuntimeException。

我認為你的可能性很小。 您可以將結果與要獲取的起始元素綁定(例如分頁)。 您也可以編寫適當的 SQL 查詢,而不是使用 HQL 或條件。 如果您使用額外的惰性收集,Hibernate 可能會在您每次從列表中獲取一個元素時執行一個查詢。 因此,每個解決方案的有效性嚴格取決於您的應用程序和數據庫中的數據量。

暫無
暫無

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

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