Este artículo describe el principio y el método de implementación de la carga de retraso de hibernación. Compártelo para su referencia, como sigue:
Para optimizar aún más el rendimiento de Hibernate, puede usar:
Tecnología de carga de latencia, gestión de estrategias de rastreo de datos y realización de gestión de caché para mejorar el rendimiento de Hibernate.
1. Retraso de carga (carga)
La carga perezosa es un mecanismo proporcionado por Hibernate para mejorar la eficiencia de la ejecución del programa, es decir, se creará solo cuando los datos del objeto realmente se usen.
El proceso de carga perezosa: la carga de retraso se logra a través del mecanismo de poder. Cuando Hibernate obtiene datos de cierto objeto de una base de datos, al obtener el valor del atributo de recopilación de un objeto, o al obtener otro objeto asociado con un objeto, ya que los datos del objeto no se usan (excepto el identificador), Hibernate no carga los datos reales de la base de datos, pero solo crea un objeto proxy para el objeto para representar el objeto. Todos los atributos en este objeto son los valores predeterminados; Este objeto real se crea solo cuando los datos del objeto realmente necesitan ser utilizados, y sus datos realmente se cargan desde la base de datos.
Cuando se llama al método Load () en la sesión para cargar una entidad; Cuando la sesión carga una entidad, el valor del atributo de colección en la entidad se cargará con carga retrasada; Cuando la sesión carga una entidad, el otro objeto de la entidad que la entidad tiene un solo extremo, la carga retrasada se utilizará para otro objeto de entidad asociado con el extremo único
Apague la carga perezosa: al cargar una sola entidad, puede usar el método get ().
Para los atributos de recolección en entidades, puede agregar atributo lazy = "falso" a este conjunto (<set>, <bag>, <list> ...). Cuando una asociación de un solo extremo de otro objeto de entidad, puede configurar <One to-One>, <ingle-to-uno> para agregar atributo perezoso = "falso" en el archivo de mapeo Nota: One to One no puede haber restringido = verdadero (la clave extranjera se muestra en la declaración SQL generada), de lo contrario, la carga perezosa no funcionará.
2. Los principales tipos de carga perezosa se utilizan en Hibernate de forma predeterminada:
• La carga perezosa se usa cuando se llama al método Load () en la sesión para cargar una entidad.
• Cuando una sesión carga una entidad, los valores del atributo de colección en esta entidad se cargan con retraso. (uno a muchos)
• Cuando una sesión carga una entidad, otro objeto de entidad que es de un solo extremo (uno a uno, muchos a uno) asociado con la entidad está cargado.
• La diferencia entre la segunda y la tercera es: en el segundo caso, el método para cancelar la carga de retraso es establecer el atributo de carga Lazy Lazy = "False" después de la etiqueta establecida del archivo de asignación de la única parte que tiene el atributo establecido; En el tercer caso, la etiqueta de muchos a uno en el archivo de mapeo de la parte múltiple que tiene la etiqueta de muchos a uno, es decir, la etiqueta de muchos a uno.
Los objetos que pueden ser cargados son todos objetos de proxy reescritos. Cuando la sesión asociada no está cerrada, acceder a las propiedades de estos objetos cargados perezosos (proxy) (excepto getid y getClass) Hibernate inicializará estos proxy o usará hibernate.initialize (proxy) para inicializar objetos proxy; Cuando la sesión asociada está cerrada, se producirá una excepción para acceder al objeto cargado perezoso.
3. Estrategia de rastreo (Fetch)
Configure la "política de rastreo" para afectar directamente el efecto de consulta de los métodos get () y load () de la sesión.
Estrategia de rastreo en asociación de un solo extremo <Bose-to-One> <One-o-_one>:
Puede agregar atributos de búsqueda a elementos de mapeo asociados de un solo extremo. Seleccionar: carga de retraso; Unir: use una conexión intra en la misma declaración de selección para obtener los datos del objeto y los datos de su objeto asociado. En este momento, la carga de retraso del objeto asociado no es válido.
Estrategia de rastreo en propiedades de recolección :
Seleccionar: carga de retraso; Únase: use intraining en la misma declaración selecta para obtener el conjunto de asociación de la otra parte. En este momento, el perezoso en el conjunto asociado no será válido. Subselección: envíe otra declaración de consulta o subconsulta para rastrear. Esta estrategia también funciona para consultas HQL.
4. Análisis de casos de carga perezosa
Caso 1: Una entidad única llama al método Load () para cancelar la carga perezosa
paquete com.hbsi.test; import org.hibernate.session; import org.junit.test; import com.hbsi.domain.user; import com.hbsi.utils.hibernateUtiliTil; publicClass testlazy {// test get () método; get () método siempre ejecutará sql @testpublVoid testget () HibernateUtil.getSession (); usuario user = (usuario) session.get (user.class, 1); // system.out.println (user.getName ()); hibernateUtil.close (); // nota aquí: incluso si la sesión está cerrada y el usuario está en el estado administrado, aún se puede utilizar el objeto del usuario; Esto se debe a que, aunque está en el estado administrado, este objeto es un objeto con valores de atributos y no lo elimina, pero solo aísla el canal para su trato con la base de datos. System.out.println (user.getName ());} // método testLoad (); No ejecute la instrucción SQL, y solo ejecute @TestPublicVoid testLoad () {session session = hibernateUtil.getSession (); usuario user = (usuario) session.load (user.class, 1); // La identificación de salida aquí no ejecutará la instrucción SQL. Obtendrá directamente la identificación de la identificación que pasó arriba. No se busca desde la base de datos, por lo que la declaración SQL System.out.println (user.getID ()); // El nombre de salida es diferente. En este momento, el objeto proxy está realmente instanciado. Este es el objeto proxy con el atributo de nombre. En este momento, incluso si cierre la sesión, aún puede obtener el nombre a través de este objeto. Si comenta esta oración, es decir, el objeto proxy no instancia el objeto proxy y luego ejecuta el atributo de nombre de salida después de cerrar la sesión, se informará un error: no se pudo inicializar proxy // system.println (user.getName ()); hibercernateUtil.close (); system.println (user.getName ();}}}}}}Situación 2: Cancelar la carga perezosa en el set
Pruebe si la carga perezosa en el atributo de colección se establece en falso en el archivo de mapeo, se colocará junto con los datos en la tabla de órdenes, es decir, dos declaraciones selectas
@Testpublicvoid find () {session session = hibernateUtil.getSession (); cliente cus = (cliente) session.get (customer.class, 3); system.out.println (cus.getcname ()); // use el siguiente método para generar las declaraciones SQL durante dos días, y están separados; Si se usa la carga perezosa, se emitirán dos declaraciones SQL primero, y el resultado de salida es // el método no puede estar directamente encadenado aquí a la salida cus.getord (). getOname (); Porque cus.getord () devuelve un conjunto establecido SET <Rders> Orders = cus.getord (); System.err.println (Orders.Size ()); HibernateUtil.Close ();}Método 3: <One-One>, <ingle-to-one> Cancelar la carga perezosa
@TestPublicVoid find () {// Por defecto, la carga perezosa, es decir, emitir uno con una instrucción SQL; Si la carga de retraso se establece en falsos y emite dos declaraciones SQL, se encontrará información del cliente no deseada. Sesión session = hibernateUtil.getSession (); Orders ord = (Orders) Session.get (Orders.Class, 3); System.out.println (ord.getoname ()); HibernateUtil.Close ();}Espero que la descripción en este artículo sea útil para la programación Java de todos en función del marco Hibernate.