2012-07-24 21 views
7

Supongamos que tengo el siguiente objeto:ORMLite LazyForeignCollection: ¿cómo consultar una colección solo una vez?

public class MyOwnList { 

    @DatabaseField(id= true) 
    protected int id; 

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

Como items está marcado como perezosos que no se cargará si me carga el objeto de lista de la base de datos. ¡Eso es exactamente lo que quiero!

El problema es que cada vez que tengo acceso a items, ORMLite realiza una consulta SQL para obtener la colección. Solo lo descubrió después de activar el registro de ORMLite ...

¿Por qué lo hace? ¿Hay alguna buena razón para eso?

¿Hay alguna forma en que pueda cargar la colección de forma perezosa, pero solo una vez, no cada vez que accedo a la colección? Entonces, ¿algo entre impaciente y perezoso?

+1

Bueno, el nombre 'List' era solo para el ejemplo. Lo cambié para evitar malentendidos. – d1rk

Respuesta

7

El problema es que cada vez que accedo a elementos, ORMLite realiza una consulta SQL para obtener la colección.

Al principio no entendí esto. Lo que está solicitando es ORMLite para almacenar en caché la colección de artículos después de que la carga sea lenta la primera vez. El problema con esto es que ORMLite no tiene idea de qué tan grande es tu colección de items. Una de las razones por las que se usan colecciones flojas es para manejar colecciones grandes. Si ORMLite mantuvo todas las colecciones perezosas en la memoria, podría llenar la memoria.

Agregaré a la lista TODO algo como que hace un híbrido entre perezoso y ansioso. Buena sugerencia.

+0

En el documento dice 'Si impaciente se establece en verdadero, entonces la consulta por separado se realiza de inmediato y las órdenes se almacenan como una lista dentro de la colección'' Estoy buscando una combinación de carga diferida de la colección tan pronto como sea accedido la primera vez. Pero una vez que se realizó la consulta SQL para esta colección, guárdela como una lista dentro de la colección. De esta manera puedo tener múltiples LazyForeignCollections en mi entidad, pero no causan consultas SQL adicionales como EagerForeignCollections, si nunca se accede a la Colección. ¿Cómo superaste ese problema hasta ahora? Tal vez algún consejo? – d1rk

+0

@ d1rk Una vez más, el problema es que la colección puede ser ENORME, lo que puede abrumar la memoria. Esta es la forma en que hibernate y otras bibliotecas ORM funcionan. O te pones ansioso o perezoso. Lo he agregado a la lista de TODO. – Gray

+0

@Gray Voto enorme para este TODO - Inicialmente asumí que las colecciones de Lazy funcionaban de esta manera ("lazyCached") ... en parte esto era porque pensaba que el problema con Eager era más * operaciones de base de datos * que * consumo de memoria * (" muchas operaciones de base de datos van a suceder cada vez que consulta por A "- http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/ForeignCollectionField.html#maxEagerLevel()). ¿Algún progreso en la función? Gracias por ORMLite! –

Cuestiones relacionadas