sobre session.close, ¿no eliminará todos los objetos que eran persistentes en el alcance de la sesión?
Jigar Joshi
Sí, se eliminará, por lo que cada vez que cierre una sesión, el estado persistente de un objeto se convertirá en estado Separado.
Rachel
@Rachel bonito enlace provisto con código para una comprensión más profunda
Priyank Thakkar
Respuestas:
161
Una newinstancia de una clase persistente que no está asociada con a Session, no tiene representación en la base de datos y Hibernate considera que ningún valor identificador es transitorio :
Person person =newPerson();
person.setName("Foobar");// person is in a transient state
Una instancia persistente tiene una representación en la base de datos, un valor identificador y está asociada con un Session. Puede hacer que una instancia transitoria sea persistente asociándola con Session:
Long id =(Long) session.save(person);// person is now in a persistent state
Ahora, si utilizamos closeel Hibernate Session, la instancia persistente se convertirá en una instancia separada : ya no se adjunta a una Session(pero aún se puede modificar y volver a adjuntar a una nueva Sessionmás adelante).
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.
Un valor de identificador probablemente no sea una condición estricta para que un objeto sea persistente, ya que podría usar la estrategia de generación de identificador asignado.
Abhijeet Kashnia
Además de cerrar la sesión que leyó en la instancia, uno puede separar una instancia llamando a session.evict (). Esto evita que Hibernate lo administre (por lo tanto, evita que los cambios en la instancia se propaguen automáticamente a la base de datos). Puede enviar cambios a la base de datos a través de session.update () y volver a adjuntarlo con session.merge ().
Mooshu
1
Muchas veces no seguimos los documentos originales proporcionados por los marcos ... que en algún momento tienen información oculta con una descripción adecuada, solo necesitamos explorar. el único problema es que no lo encontramos fácilmente :)
agpt
A persistent instance has a representation in the databaseUna entidad persistente no tiene una representación en la base de datos antes de realizar la operación de guardar.
O.Badr
1
Entonces, ¿la diferencia entre entidades separadas y transitorias es la presencia de ID ? Si creo una nueva instancia con una identificación asignada, entonces formalmente es transitoria, porque aún no se conserva, pero no se puede distinguir de una separada, porque tiene una identificación. ¿Correcto?
Ruslan Stelmachenko
9
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. Las instancias transitorias serán destruidas por el recolector de basura 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 de reflexión del usuario. Las llamamos transacciones de aplicaciones, es decir, una unidad de trabajo desde el punto de vista del usuario.
Permítanme explicarles también el punto de vista del recolector de basura.
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 =newStudent();
Ahora, este objeto de estudiante está en estado transitorio .
Cuando adjuntamos este objeto POJO para hibernar la 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. Por lo tanto, podemos decir que el estado persistente es como un 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 eliminar 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 que podemos decir que este estado de almacenamiento de la base de datos es como un almacenamiento permanente para POJO objetos )
Si realizamos->
session.evict(student);
entonces el objeto POJO es desalojado o retirado del estado persistente al estado separado. Entonces 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)
la entidad acaba de ser instanciada y no está asociada con un contexto de persistencia. No tiene representación persistente en la base de datos y, por lo general, no se ha asignado ningún valor de identificador (a menos que se haya utilizado el generador asignado).
City city =newCity();
administrado o persistente
la entidad tiene un identificador asociado y está asociada con un contexto de persistencia. Puede o no existir físicamente en la base de datos todavía.
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate// and reflected to the database when the persistence context is flushed.
session.save(city);
separado
la entidad tiene un identificador asociado, pero ya no está asociada con un contexto de persistencia (generalmente porque el contexto de persistencia se cerró o la instancia fue desalojada del contexto)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
remoto
la entidad tiene un identificador asociado y está asociada con un contexto de persistencia, sin embargo, está programada para su eliminación de la base de datos.
session.remove(city);
Nota: La
API de Hibernate ofrece pares de métodos para cambiar entre estados de entidad, y creo que vale la pena explorar una clase de sesión de Hibernate .
Respuestas:
Una
new
instancia de una clase persistente que no está asociada con aSession
, no tiene representación en la base de datos y Hibernate considera que ningún valor identificador es transitorio :Una instancia persistente tiene una representación en la base de datos, un valor identificador y está asociada con un
Session
. Puede hacer que una instancia transitoria sea persistente asociándola conSession
:Ahora, si utilizamos
close
el HibernateSession
, la instancia persistente se convertirá en una instancia separada : ya no se adjunta a unaSession
(pero aún se puede modificar y volver a adjuntar a una nuevaSession
más adelante).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.
fuente
A persistent instance has a representation in the database
Una entidad persistente no tiene una representación en la base de datos antes de realizar la operación de guardar.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. Las instancias transitorias serán destruidas por el recolector de basura 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 de reflexión 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
fuente
Permítanme explicarles también el punto de vista del recolector de basura.
Hay 3 estados de Objeto de hibernación (o) Alcance de Objeto de hibernación-
Es mejor entender con un ejemplo de código:
Consideremos una clase POJO como Student Object->
Ahora, este objeto de estudiante está en estado transitorio .
Cuando adjuntamos este objeto POJO para hibernar la sesión->
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. Por lo tanto, podemos decir que el estado persistente es como un almacenamiento temporal para objetos POJO )
Si realizamos->
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 eliminar 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 que podemos decir que este estado de almacenamiento de la base de datos es como un almacenamiento permanente para POJO objetos )
Si realizamos->
entonces el objeto POJO es desalojado o retirado del estado persistente al estado separado. Entonces 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)
fuente
Dada la siguiente entidad:
De la documentación de Hibernate 5.2 (también he incluido el
removed
estado):Nota: La API de Hibernate ofrece pares de métodos para cambiar entre estados de entidad, y creo que vale la pena explorar una clase de sesión de Hibernate .
fuente
Además de la respuesta correcta ya identificada, persistente, transitorio, separado son solo el estado del objeto en hibernación.
Para ser más precisos, estos tres estados realmente muestran los cambios del objeto de hibernación y el estado del ciclo de vida de la sesión.
fuente