¿Diferencia entre FETCHType LAZY y EAGER en Java Persistence API?


Answers

Básicamente,

LAZY = fetch when needed
EAGER = fetch immediately
Question

Soy un novato en Java Persistence API e Hibernate.

¿Cuál es la diferencia entre FetchType.LAZY y FetchType.LAZY en Java Persistence API?




Puedo considerar el rendimiento y la utilización de la memoria. Una gran diferencia es que la estrategia de búsqueda de EAGER permite usar objetos de datos obtenidos sin sesión. ¿Por qué?
Todos los datos se obtienen cuando los datos marcados impacientes en el objeto cuando se conecta la sesión. Sin embargo, en el caso de una estrategia de carga diferida, el objeto marcado de carga diferida no recupera datos si la sesión se desconecta (después de la instrucción session.close() ). Todo lo que puede hacer el proxy de hibernación. La estrategia impaciente permite que los datos estén disponibles después de la sesión de cierre.




El tipo Lazy Fetch es seleccionado de forma predeterminada por Hibernate a menos que Eager explícitamente el tipo de Eager expeditiva. Para ser más preciso y conciso, la diferencia puede establecerse a continuación.

FetchType.LAZY = Esto no carga las relaciones a menos que lo invoque mediante el método getter.

FetchType.EAGER = Esto carga todas las relaciones.

Pros y contras de estos dos tipos de búsqueda.

Lazy initialization mejora el rendimiento al evitar el cálculo innecesario y reducir los requisitos de memoria.

Eager initialization requiere más consumo de memoria y la velocidad de procesamiento es lenta.

Habiendo dicho eso, depende de la situación ya sea que se pueda usar una de estas inicializaciones.




@ drop-shadow si está utilizando Hibernate, puede llamar a Hibernate.initialize() cuando invoque el método getStudents() :

Public class UniversityDaoImpl extends GenericDaoHibernate<University, Integer> implements UniversityDao {
    //...
    @Override
    public University get(final Integer id) {
        Query query = getQuery("from University u where idUniversity=:id").setParameter("id", id).setMaxResults(1).setFetchSize(1);
        University university = (University) query.uniqueResult();
        ***Hibernate.initialize(university.getStudents());***
        return university;
    }
    //...
}



Según mi conocimiento, ambos tipos de búsqueda dependen de tu requerimiento.

FetchType.LAZY está bajo demanda (es decir, cuando requerimos los datos).

FetchType.EAGER es inmediato (es decir, antes de que surja nuestro requerimiento, estamos recolectando el registro innecesariamente)




Tanto FetchType.LAZY como FetchType.EAGER se utilizan para definir el plan de recuperación predeterminado .

Desafortunadamente, solo puede anular el plan de recuperación predeterminado para la recuperación de LAZY. La búsqueda de EAGER es menos flexible y puede generar muchos problemas de rendimiento .

Mi consejo es restringir el impulso de hacer que tus asociaciones EAGER, porque ir a buscar es una responsabilidad en tiempo de consulta. Entonces, todas sus consultas deberían usar la directiva fetch para recuperar solo lo que sea necesario para el caso comercial actual.




Related