¿Qué son los objetos separados, persistentes y transitorios en hibernación? Explique con un ejemplo.
¿Qué son los objetos separados, persistentes y transitorios en hibernación? Explique con un ejemplo.
Respuestas:
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 = new Person();
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.
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.
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
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->
Student student = new Student();
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)
Dada la siguiente entidad:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
De la documentación de Hibernate 5.2 (también he incluido el removedestado):
transitorio
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 = new City();
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 .
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.