Estoy tratando de entender cuál es la diferencia en el objeto devuelto y el comportamiento de Hibernate 3.6 session.get()
y session.load()
.Hibernate 3.6 - session.get() vs session.load()
Desde el javadoc:
get():
retorno persistente la instancia de la clase determinada entidad con el identificador dado , o null si no hay tal instancia persistente. (Si la instancia ya está asociada a la sesión, regresa esa instancia Este método no devuelve una instancia sin inicializar..)
carga():
retorno persistente la instancia de la clase de entidad dada con el identificador dado , suponiendo que exista la instancia. Este método podría devolver una instancia de proxy que se inicializa bajo demanda, cuando se accede a un método sin identificador .
Tengo tres preguntas:
el Javadoc no dice cuándo podría volver
load()
un proxy - ¿hay alguna manera de saber de antemano?Cuando
load()
devuelve un proxy - esto significaload()
no accedió a la base de datos, ¿estoy en lo correcto? Entonces, ¿qué ocurre si proporcionoload()
con un identificador que no existe en la base de datos? Ahora tendré en la sesión un proxy con una identificación inválida (sin obtener una excepción). Ahora quiero permitir que otra instancia persistente apunte a ese proxy: ¿funcionará? Para este escenario, no necesito inicializar el proxy, solo necesito su id (que aunque no es válido porque no está en la base de datos). Así que supongo que estoy preguntando si mi descripción es correcta, y siempre tengo que retirar elload()
objeto devuelto conisInitialized()
para asegurarme de que representa una entidad válida (o al menos un proxy válido), es decir, con un válido CARNÉ DE IDENTIDAD.Además, lo que sucede si
load()
devuelve un proxy, por lo que el proxy es la instancia que ya está asociada a la sesión. Luego, según la descripción deget()
: "Si la instancia ya está asociada a la sesión, devuelva esa instancia". - Entonces, ¿get()
devuelve el proxy? Dado que de acuerdo con la descripción deget()
: "Este método nunca devuelve una instancia no inicializada".
Gracias!
ACTUALIZACIÓN
son los siguientes correcta?
(A) Creo que las dos load()
y get()
primero tratará de verificar el caché de sesión antes de ir a la base de datos - por lo que no sería correcto decir que cualquiera de ellos siempre da en la base de datos, o siempre devuelve un proxy.
(B) un proxy inicializado no es la misma que la instancia original, como se puede leer aquí: http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/
1.Pero si ya tenía una instancia inicializada (para este ID) en la sesión, ¿no devolvería esa instancia y no un proxy? Además, el javadoc dice: "Este método puede devolver una instancia de proxy" - no dice "este método siempre". 2. Es una especie de falla de diseño, ya que de acuerdo con lo que dices cuando tengo un proxy y quiero asegurarme de que representa una identificación real en DB (y siempre quiero asegurarlo), incluso si solo uso el proxy para indicarle otras instancias) - entonces no puedo saber que la ID que usé es válida hasta que la inicialice, pero en este caso, ¿por qué usar un proxy? – rapt
3. ¿Quiere decir que 'get()' después de 'load()' devolverá un proxy inicializado, o solo una instancia inicializada? Dado que si es el último, entonces ahora tenemos en la sesión dos objetos que tienen el mismo ID (el proxy y la instancia). Por cierto, sé que es posible tener dos proxies que representen la misma ID de DB, como puede leer aquí: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ debajo del texto " En segundo lugar, es posible romper el proxy ". - Ver más en ACTUALIZACIÓN en mi pregunta original. – rapt
Sí. Tiene razón. Sus preguntas me ayudan a aclarar algunos malentendidos sobre 'get()' y 'load()'. Vea mi actualización, por favor –