2012-06-17 6 views

Respuesta

5

La carga lenta funciona por el hecho de que Hibernate usa estructuras que pueden ser procesadas para saber cuándo intenta acceder a los datos por primera vez. Cuando haces esto, estas estructuras le dicen a hibernate que ahora necesitan cargar la información e Hibernate lo hará sobre la marcha, sin que tú sepas lo que está sucediendo.

Las matrices no se pueden cargar de forma diferida porque Hibernate no podría saber que está intentando acceder a ellas por primera vez, ya que no puede usar el operador "[]" (aaload bytecode), Hibernate nunca sabría cuándo intentó acceder por primera vez, por lo que no podría cargarlo sobre la marcha.

Al utilizar colecciones, siempre debe acceder a ellas a través de sus métodos, por lo que Hibernate puede estar 100% seguro cuando intenta acceder a ellas por primera vez y luego cargarlas.

Por lo tanto, la verdadera razón es que no hay forma de conectar su código al operador de acceso a la matriz. Lo mismo ocurre con la carga diferida de los campos, Hibernate no puede cargar de forma diferida una propiedad que no sea de recopilación con acceso de campo único, ya que no sabría cuándo intentó acceder al campo, siempre necesitan tener acceso de método get/set.

Como un ejemplo de cómo se hace esto, se puede comprobar la colección PersistentList en hibernación, en el que es indexOf método (y muchos otros) el método read se llama:

public int indexOf(Object value) { 
    read(); 
    return list.indexOf(value); 
} 

Y al final el read El método simplemente inicializa la colección si todavía no se ha cargado de forma diferida.

+0

Muchas gracias por su respuesta. Parece una locura que no puedas usar Array solo porque Hibernate no puede conectar el operador de acceso a la matriz. ¿Entonces viene básicamente de una limitación de lenguaje Java? – fabien7474

+1

Sí, pero es una limitación importante desde el punto de vista del rendimiento, si el acceso a la matriz fuera una llamada a un método, tomaría al menos dos operaciones para hacerlo. Tampoco tiene mucho sentido utilizar una matriz en este caso, ya que agregaría o eliminaría objetos de la colección de hibernación y esto no es algo fácil de hacer en una matriz. –

Cuestiones relacionadas