La principal investigación en este artículo es
El concepto de perezoso : solo cargue un objeto cuando realmente se usa.
La estrategia perezosa de Hibernate se puede usar en:
1. En la etiqueta <class>, el valor se puede tomar: verdadero/falso.
2. En la etiqueta <Protey>, el valor se puede tomar: Verdadero/Falso, y la herramienta de mejora de la clase se requiere para modificar el ByTecode (esto no tiene mucho sentido).
3. En las etiquetas <Set> y <List>, los valores se pueden tomar: Verdadero/Falso/Extra.
4. En las etiquetas de asociación de un solo extremo de <ingle-to-one> y <One-One>, puede obtener el valor: falso/proxy/nofo
Echemos un vistazo a la perezosa en la etiqueta de clase:
User.java:
Usuario de clase pública {/ * id */private int id;/ * nombre de usuario */privado name de cadena;/ * contraseña de usuario */private string contraseña;/ * tiempo de creación */private createTeTime; // omitir métodos setter y getter}User.hbm.xml:
<? xml versión = "1.0"?> < paquete = "com.lixue.bean"> <!-El nombre del nodo de clase representa el nombre de clase de la entidad, y la tabla representa el nombre de la entidad asignada a la tabla en la base de datos-> <class name = "user" table = "t_user" lazy = "true"> <id name = "id" name = "Password" /> <Property Name = "CreateTime" /> </sclass> < /hibernate-mapping>
Método de prueba:
public void testLoad1 () {/*get User, Load mismo es compatible con la carga perezosa (la etiqueta de clase Lazy es válida para propiedades ordinarias)*/user user = (usuario) hibernateUtils.getSession (). Load (user.class, 1);/*no emitirá sql (porque la identificación se especifica cuando consulta, no es necesario verificarlo de nuevo)*/sistema. user.getId ());/* emitirá SQL, porque los atributos son realmente necesarios en este momento, se emitirá la instrucción SQL, y la declaración emitida encontrará todos los atributos, y los atributos posteriores no emitirán declaraciones*/System.out.println ("user.nname =" + user.getName ();/* no emitirá sql (se encontró cuando se descubrió cuando se descubrió cuando se descubrió que se encontró en la comprobación de los cheCking. Nombre)*/System.out.println ("user.password =" + user.getpassword ());/*no emitirá sql (se descubrió al verificar el nombre)*/system.out.println ("user.createTime =" + user.getCreateTime ();} Pruebe un punto de interrupción en User user = (User) HibernateUtils.getSession().load(User.class, 1); ¡Para las pruebas!
El objeto aparecerá en el usuario del objeto-> Handler ---> Nodo de destino, como se muestra en la figura:
1. Al principio, el objetivo es nulo. Cuando user.getId() se ejecuta, todavía es nulo, porque la ID ya está especificada cuando consultamos, por lo que no tiene sentido consultar en este momento.
2. Al ejecutar user.getName() , se emite una declaración, como se muestra en la figura:
De la figura, podemos ver que al consultar la ID, no se emitió ninguna declaración. Como acabamos de mencionar, cuando consultamos el atributo de nombre, emitimos una declaración, y la función de esta declaración es consultar todos los atributos.
3. Cuando user.getPassword() y user.getCreateTime() se ejecutan, la declaración ya no se emitirá porque el valor del atributo se ha consultado antes.
Nota: Lazy en la etiqueta <class> solo admite atributos normales y no afectará la carga de colecciones en la clase.
Lo anterior se trata de perezoso en la etiqueta <class> de Hibernate Lazy Loading, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!