Desde el Hibernate forum:
Este del libro de hibernación en acción. Bueno leer este ..
Recuperando objetos por identificador El siguiente fragmento de código de Hibernate recupera un objeto de usuario de la base de datos:
User user = (User) session.get(User.class, userID);
El método get() es especial porque el identificador identifica de manera única una sola instancia de de una clase. Por lo tanto, es común que las aplicaciones usen el identificador como un identificador conveniente para un objeto persistente. La recuperación por identificador puede usar el caché al recuperar un objeto, evitando que se golpee una base de datos si el objeto ya está en caché. Hibernate proporciona también un método de carga():
User user = (User) session.load(User.class, userID);
La carga() método es más; get() se agregó a la API de Hibernate debido a la solicitud del usuario . La diferencia es trivial:
Si la carga() no puede encontrar el objeto en la caché o base de datos, una excepción es lanzada . El método load() nunca devuelve null. El método get() devuelve null si no se puede encontrar el objeto.
El método load() puede devolver un proxy en lugar de una instancia real persistente. Un proxy es un marcador de posición que desencadena la carga del objeto real cuando se accede al por primera vez; En el por otro lado, get() nunca devuelve un proxy. Elegir entre get() y load() es fácil: si está seguro de que existe el objeto persistente y la inexistencia se considerará excepcional, load() es una buena opción . Si no está seguro de que haya una instancia persistente con el identificador dado, use get() y pruebe el valor de retorno para ver si es nulo. Usar load() tiene una implicación adicional: la aplicación puede recuperar una referencia válida (un proxy) a una instancia persistente sin golpear la base de datos para recuperar su estado persistente. Por lo tanto, load() no puede lanzar una excepción cuando no encuentra el objeto persistente en el caché o la base de datos; la excepción se lanzaría más tarde, cuando se accede al proxy . Por supuesto, recuperar un objeto por identificador no es tan flexible como usar consultas arbitrarias .
Estoy depurando un problema ahora mismo donde session.Get() está devolviendo un proxy! –
¡Muchas gracias! La parte de dinero para mí fue: "Si load() no puede encontrar el objeto en el caché o la base de datos, se lanza una excepción. El método get() devuelve null si el objeto no se puede encontrar". – Chris
El JavaDoc para Session.get dice: Devuelve la instancia persistente de la clase de entidad dada con el identificador dado, o nulo si no hay tal instancia persistente. (Si la instancia, o un proxy para la instancia, ya está asociado a la sesión, devuelva esa instancia o proxy.) Entonces la sección del libro que dice: "Por otro lado, get() nunca devuelve un proxy". no es correcto. – Vicky