hibernate - vago - hibernar, ser perezoso o no ser perezoso
que hacer para no tener flojera (2)
Bueno, describiste el problema correctamente. Es solo una compensación entre simplicidad (solo un método) y rendimiento (dos métodos, cada uno devuelve exactamente lo que se necesita). Si el tiempo de respuesta es correcto solo con usar el método simple y cargar las B de forma diferida, entonces no toque nada. Si el tiempo de respuesta es demasiado largo, y ha medido esa carga ansiosa, sería correcto, luego introduzca un nuevo método.
Mantenga las cosas simples, y optimice solo si es necesario. Las asociaciones de carga diferida son rápidas, ya que solo hacen una consulta en una clave externa, que debe indexarse en la base de datos.
Tampoco es tan raro que se carguen dos a muchas asociaciones: es común mostrar todos los productos de una categoría en una página, pero es poco común mostrar todas las compras de todos los productos de una categoría.
Tengo la entity A
, que tiene una relación de muchos a muchos con la entity B
Entonces el diseño de la tabla es: A, AB(mapping table), B
Para obtener un objeto de la entidad A: llamo a A.getById()
que getHibernateTemplate().get(A.class, id)
usando spring e hibernate.
El problema es que, a veces, el código siguiente solo necesita A, a veces el código subsiguiente continuará accediendo a las B asociadas, por lo que nos gustaría utilizar la carga diferida en algunos casos y estar ansiosos en algunos otros casos. pero el problema es que todo el acceso a la base de datos se proporciona a través del mismo ADao.java
, por lo que solo hay un método getById()
.
¿Debo crear dos versiones del método getById ()?
Pero luego, para casos más complejos, si A también está unida a C a través de muchos a muchos, entonces podría haber variantes de lazy-loading-C y eager-loading-C, por lo que las variantes getById()
necesarias getById()
rápidamente exponencialmente.
¿Cuál es tu opinión sobre esta elección?
Gracias
Para consideraciones generales, eche un vistazo a los documentos de Hibernate 3.6 sobre estrategias de búsqueda . La estrategia de búsqueda predeterminada se define en anotaciones de asignación o en un archivo hbm.xml. Hay tres formas de cambiar dinámicamente de una estrategia de carga lenta predeterminada a una estrategia de carga ansiosa. Los primeros dos requieren implementaciones separadas de métodos DAO para casos de uso de carga lenta y carga ansiosa:
-
Criteria.setFetchMode()
en una consulta de Hibernate Criteria -
FETCH
claveFETCH
en una consulta HQL - Desde Hibernate 3.5 (no estoy seguro ahora, tal vez 3.6), existe la tercera opción de usar los perfiles de búsqueda para cambiar dinámicamente de carga lenta a carga ansiosa.
Un perfil de búsqueda está habilitado / deshabilitado en un ámbito de sesión. Por lo tanto, siempre que el perfil de búsqueda deseado esté configurado en la sesión actual, puede usar el mismo método DAO para una carga diferida así como para un caso de uso de carga ansiosa.
Lo importante a tener en cuenta aquí es que solo puede cambiar de una estrategia de carga diferida definida en anotaciones o en un archivo hbm.xml a una estrategia de carga ansiosa y no al revés. Esta restricción es independiente del método utilizado para cambiar la estrategia de búsqueda.