2012-07-24 18 views
7

のは、私は以下の目的を持っていると仮定しましょう:私は、データベースからリストオブジェクトをロードする場合、それはロードされないように怠惰マークされORMLite LazyForeignCollection:コレクションを1回だけクエリする方法はありますか?

public class MyOwnList { 

    @DatabaseField(id= true) 
    protected int id; 

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

items通り。 これはまさに私が欲しいものです!

問題は、私がitemsにアクセスするたびに、ORMLiteはコレクションを取得するためにSQLクエリを作成することです。 ORMLiteのログを有効にした後にのみそれを発見しました...

それはなぜですか?それにはどんな理由がありますか?

私はコレクションにアクセスするたびにコレクションを読み込むことはできませんが、一度だけではありません。熱心で怠け者の間の何か?

+1

名前 'List'は例のためのものです。私は誤解を避けるためにそれを変更しました。 – d1rk

答えて

7

問題は、アイテムにアクセスするたびにORMLiteがコレクションを取得するためのSQLクエリを作成することです。

最初は分かりませんでした。あなたが尋ねているのは、最初に怠惰に読み込んだ後にアイテムのコレクションをキャッシュすることです(ORMLite)。このデフォルトの問題は、ORMLiteがitemsのコレクションの大きさを知らないことです。遅延コレクションが使用される理由の1つは、大きなコレクションを処理することです。 ORMLiteがすべてのレイジーコレクションをメモリ内に保持すると、メモリがいっぱいになる可能性があります。

のようなものをTODOリストに追加します。これは、遅延と熱心の間のハイブリッドです。良い提案。

+0

文書に「eagerがtrueに設定されていれば、すぐに別のクエリが行われ、注文はコレクション内のリストとして保存されます」 すぐにコレクションの遅延読み込みの組み合わせを探しています初めてアクセスしました。しかし、このコレクションのSQLクエリが作成されたら、それをコレクション内のリストとして格納します。 この方法では、自分のエンティティで複数のLazyForeignCollectionを持つことができますが、コレクションにアクセスすることができない場合、EagerForeignCollectionsのような追加のSQLクエリは発生しません。 これまでどのようにこのような問題を解決しましたか?たぶんいくつかのアドバイス? – d1rk

+0

@ d1rkもう一度、問題はコレクションがメモリを圧倒する可能性がある巨大かもしれないということです。これは、休止状態やその他のORMライブラリが動作する方法です。あなたは熱心でも怠け者でもありません。 TODOリストに追加しました。 – Gray

+0

@Grayこれは、Lazyコレクションがこのように動作することを当初想定していました(lazyCached)...これは、Eagerの問題がメモリ消費量* A " - http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/ForeignCollectionField.html#maxEagerLevel())をクエリするたびに、多くのデータベース操作が実行されます。機能の進捗状況は? ORMLiteに感謝します! –

関連する問題