lazy hibernate mapping lazy-loading

hibernate lazy



Asignación de hibernación XML: ¿Lazy False o Fetch Select? (2)

Creo que el modo de captura y el tiempo de captura son conceptos que no se superponen totalmente.

Lazy="true|false" controla si una asociación se carga con entusiasmo o bajo demanda.

fetch="select|subselect|join|batch" controla cómo se carga esa entidad o colección, cuando se requiere que se cargue.

Entonces, para responder a su pregunta, tener fetch="select" significa:

"se utiliza un segundo SELECT para recuperar la entidad o colección asociada. A menos que deshabilite explícitamente la búsqueda perezosa especificando lazy =" false ", esta segunda selección solo se ejecutará cuando acceda a la asociación". ( http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching )

¡Esto no significa que la carga perezosa esté deshabilitada! Eso está controlado por el indicador lazy="true|false" . Con lazy="true" y fetch="select" Hibernate cargará perezosamente la colección y la cargará con una selección. Si establece lazy="false" , se ejecutará la misma selección, la diferencia será que se ejecutará con entusiasmo. Espero que esto tenga sentido.

Eche un vistazo aquí también: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

Tengo una pregunta simple. Encontré esta configuración de Hibernate en nuestro proyecto:

<many-to-one name="employee" class="com.myapp.Employee" cascade="merge" lazy="false" fetch="select"> <column name="employee_id" sql-type="bigint" not-null="true"/> </many-to-one>

Fetch = "select" significa "Lazy carga todas las colecciones y entidades" basadas en Fetching Strategies . Pero escribiendo perezoso = "falso" significa no cargar perezoso. Así que la configuración anterior dice: "Deshabilitar la carga perezosa. Habilitar la carga perezosa". En efecto, esto significa que la propiedad está cargada perezoso?

Así que podría acortar esa configuración como:

<many-to-one name="employee" class="com.myapp.Employee" cascade="merge" fetch="select"> <column name="employee_id" sql-type="bigint" not-null="true"/> </many-to-one>

¿Pero no es fetch = "seleccionar" el modo predeterminado? Entonces, en efecto, puedo declarar la misma configuración que:

<many-to-one name="employee" class="com.myapp.Employee" cascade="merge"> <column name="employee_id" sql-type="bigint" not-null="true"/> </many-to-one>

¿Estoy en lo correcto? ¿Incorrecto? Ideas? Gracias

Si quiero habilitar la carga diferida, debo agregar lazy = "true" y eliminar lazy = "false" ?


Si lo configura como perezoso, el mapa externo no seleccionará al empleado si no es necesario. La búsqueda muestra cómo consultaría al empleado si fuera necesario.