Solución:
EXTRA = .size () y .contains () no inicializarán toda la colección
CIERTO = inicializar toda la colección en el primer acceso
FALSO = Carga ansiosa
En realidad, no hay razón para usar @LazyCollection
.
los TRUE
y FALSE
los valores no son necesarios ya que se puede obtener el mismo comportamiento con el JPA FetchType.LAZY
o FetchType.EAGER
.
los EXTRA
value no tiene equivalente en JPA y fue diseñado para colecciones muy grandes. Cuando accedes a un EXTRA
colección perezosa por primera vez, la colección no está completamente cargada, como suele ser el caso con cualquier colección JPA.
En su lugar, cada elemento se recupera uno por uno, utilizando un secundario SELECT
. Esto puede parecer una optimización, pero no es porque EXTRA
Las colecciones perezosas son propensas a problemas de consulta N + 1.
Tenga en cuenta que esto solo funciona para colecciones ordenadas, ya sea List
(s) que están anotados con @OrderColumn
o Map
(s). Para bolsas (p. Ej., Regulares List
(s) de entidades que no conservan ningún orden determinado), el @LazyCollection(LazyCollectionOption.EXTRA)
se comporta como cualquier otro LAZY
colección (la colección se recupera por completo cuando se accede por primera vez).
Si tiene una colección muy grande, no debería mapearla en absoluto. En su lugar, debe mapear solo el @ManyToOne
side y, en lugar de una colección del lado principal, debe usar una consulta JPQL paginada.
Las consultas JPQL son mucho más fáciles de ajustar porque puede aplicar cualquier criterio de filtrado y puede paginar el conjunto de resultados.
Para darle una pista, es principalmente por razones de rendimiento, puede comenzar a leer los siguientes enlaces:
Caché de segundo nivel
Documentación de Hibernate