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.