Solución:
A new
instancia de una clase persistente que no está asociada con una Session
, no tiene representación en la base de datos y no se considera ningún valor identificador transitorio por Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
A persistente instancia tiene una representación en la base de datos, un valor identificador y está asociada con un Session
. Puedes hacer una instancia transitoria persistente asociándolo con un Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Ahora, si nosotros close
el hibernar Session
, la instancia persistente se convertirá en un separado instancia: no está adjunto a un Session
más (pero aún se puede modificar y volver a adjuntar a un nuevo Session
aunque más tarde).
Todo esto se explica claramente en todo el Capítulo 10. Trabajar con objetos de la documentación de Hibernate que solo estoy parafraseando anteriormente. Definitivamente, una lectura obligada.
El objeto en hibernación tiene los siguientes estados:
Transitorio: los objetos instanciados con el operador nuevo se denominan objetos transitorios.
Un objeto es transitorio si se acaba de crear una instancia con el operador new y no está asociado con una sesión de Hibernate. No tiene representación persistente en la base de datos y no se le ha asignado ningún valor identificador. El recolector de basura destruirá las instancias transitorias si la aplicación ya no contiene una referencia.
Persistente: un objeto que tiene una identidad de base de datos asociada se denomina objeto persistente.
Una instancia persistente tiene una representación en la base de datos y un valor identificador. Puede que simplemente se haya guardado o cargado; sin embargo, está por definición en el ámbito de una sesión. Hibernate detectará cualquier cambio realizado en un objeto en estado persistente y sincronizará el estado con la base de datos cuando se complete la unidad de trabajo.
Independiente: una instancia separada es un objeto que ha sido persistente, pero su sesión se ha cerrado.
Una instancia separada se puede volver a adjuntar a una nueva sesión en un momento posterior, lo que la hace persistente nuevamente. Esta característica habilita un modelo de programación para unidades de trabajo de larga ejecución que requieren tiempo para pensar por parte del usuario. Las llamamos transacciones de aplicaciones, es decir, una unidad de trabajo desde el punto de vista del usuario.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Permítanme explicar en el punto de vista del recolector de basura también.
Hay 3 estados de Objeto de hibernación (o) Alcance de Objeto de hibernación-
- Estado transitorio
- estado persistente
- estado separado
Es mejor entender con un ejemplo de código.
Consideremos una clase POJO como Student Object->
Student student = new Student();
Ahora, este objeto de estudiante está en estado transitorio.
Cuando adjuntamos este objeto POJO para hibernar sesión->
session.save(student);
Ahora este objeto POJO está en estado persistente.
(Punto de vista del recolector de basura: GC no puede eliminar ningún objeto que esté en estado persistente. Entonces, podemos decir que el estado persistente es como almacenamiento temporal para objetos POJO)
Si realizamos->
session.beginTransaction.commit();
entonces el objeto POJO está en estado de almacenamiento permanente o de base de datos
(Punto de vista del recolector de basura: GC no puede borrar este objeto porque este objeto POJO ahora está fuera del alcance de JVM y está almacenado en la tabla de formularios dentro de una base de datos. Por lo tanto, podemos decir que este estado de almacenamiento de la base de datos es como almacenamiento permanente para objetos POJO)
Si realizamos->
session.evict(student);
entonces el objeto POJO se desaloja o se retira del estado persistente al estado separado. Así que este estado del objeto POJO es estado separado.
(Punto de vista del recolector de basura: GC puede borrar fácilmente el objeto POJO de estado separado de JVM)