2012-07-24 56 views
7

假設我有以下對象:ORMLite LazyForeignCollection:如何只查詢一次集合一次?

public class MyOwnList { 

    @DatabaseField(id= true) 
    protected int id; 

    @ForeignCollectionField(eager = false) 
    protected Collection<Item> items; 
} 

由於items被標記爲懶惰,如果我從數據庫裝載列表對象就不會被加載。 這正是我想要的!

問題是,我每次訪問items時,ORMLite都會生成一個sql查詢來獲取集合。只有在激活ORMLite的日誌記錄後才發現它...

它爲什麼這樣做?有什麼好的理由呢?

有什麼辦法可以延遲加載集合,但只有一次,而不是每次訪問集合?那麼渴望和懶惰之間的東西?

+1

那麼'List'這個名字就是這個例子。我只是改變它以避免誤解。 – d1rk 2012-07-24 21:33:56

回答

7

問題是,我每次訪問項目時,ORMLite都會進行一次sql查詢來獲取集合。

所以最初我不明白這一點。你要求的是ORMLite緩存第一次懶惰加載它後的項目集合。這個作爲默認的問題是,ORMLite不知道你的收藏items有多大。使用懶惰集合的原因之一是處理大型集合。如果ORMLite在內存中保留所有懶惰集合,它可以填充內存。

我將添加到TODO列表中,如,它在懶惰和渴望之間進行混合。好建議。

+0

在文件中說'如果eager設置爲true,那麼單獨的查詢立即生成,並且訂單作爲列表存儲在集合中' 我正在尋找集合的延遲加載組合,只要它是第一次訪問。但是,一旦這個集合的SQL查詢完成,將它作爲一個列表存儲在集合中。 這樣我可以在我的實體中擁有多個LazyForeignCollections,但是如果Collection從未被訪問,它們不會導致像EagerForeignCollections這樣的其他SQL查詢。 到目前爲止,你是如何克服這個問題的?也許有些建議? – d1rk 2012-07-24 21:47:46

+0

@ d1rk同樣,問題是收集可能會巨大,可能會壓倒內存。這是休眠和其他ORM庫的工作方式。無論你渴望還是懶惰。我已將它添加到TODO列表中。 – Gray 2012-07-24 21:52:29

+0

@Gray對此TODO的巨大讚揚 - 我最初認爲懶惰集合以這種方式工作(「lazyCached」)......部分原因是因爲我認爲Eager的問題更多地是關於*數據庫操作*而不是*內存消耗*(「每當您查詢A時都會發生大量數據庫操作「 - http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/ForeignCollectionField.html#maxEagerLevel())。該功能的任何進展?感謝ORMLite! – 2014-05-30 09:37:45