O que são objetos separados, persistentes e transitórios em hibernação? Explique com um exemplo.
O que são objetos separados, persistentes e transitórios em hibernação? Explique com um exemplo.
Respostas:
Uma new
instância de uma classe persistente que não está associada a um Session
, não tem representação no banco de dados e nenhum valor de identificador é considerada transitória pelo Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Uma instância persistente tem uma representação no banco de dados, um valor de identificador e está associada a um Session
. Você pode tornar uma instância transitória persistente , associando-a a Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Agora, se fizermos close
o Hibernate Session
, a instância persistente se tornará uma instância desanexada : ela não está mais anexada a um Session
(mas ainda pode ser modificada e reanexada a uma nova Session
posteriormente).
Tudo isso é explicado claramente em todo o Capítulo 10. Trabalho com objetos da documentação do Hibernate que estou apenas parafraseando acima. Definitivamente, uma leitura obrigatória.
A persistent instance has a representation in the database
Uma entidade persistente não tem uma representação no banco de dados antes de confirmar a operação de salvamento.
O objeto em hibernação tem os seguintes estados:
Transiente - objetos instanciados usando o novo operador são chamados de objetos transientes.
Um objeto é transitório se acabou de ser instanciado usando o operador new e não está associado a uma Sessão do Hibernate. Ele não tem representação persistente no banco de dados e nenhum valor de identificador foi atribuído. Instâncias transientes serão destruídas pelo coletor de lixo se o aplicativo não contiver mais uma referência.
Persistente - Um objeto que possui uma identidade de banco de dados associada a ele é chamado de objeto persistente.
Uma instância persistente possui uma representação no banco de dados e um valor de identificador. Ele pode apenas ter sido salvo ou carregado; no entanto, está por definição no escopo de uma Sessão. O Hibernate detectará quaisquer mudanças feitas em um objeto em estado persistente e sincronizará o estado com o banco de dados quando a unidade de trabalho for concluída.
Detached - Uma instância separada é um objeto que foi persistente, mas sua Sessão foi fechada.
Uma instância desanexada pode ser reanexada a uma nova Sessão posteriormente, tornando-a persistente novamente. Esse recurso permite um modelo de programação para unidades de trabalho de longa execução que requerem tempo de reflexão do usuário. Nós os chamamos de transações de aplicativo, ou seja, uma unidade de trabalho do ponto de vista do usuário.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Deixe-me explicar no ponto de vista do coletor de lixo também.
Existem 3 estados de objeto de hibernação (ou) Escopo de objeto de hibernação-
É melhor entender com um exemplo de código
Vamos considerar uma classe POJO como Objeto do Aluno->
Student student = new Student();
Agora, este objeto de aluno está em estado transiente .
Quando anexamos este objeto POJO para hibernar a sessão->
session.save(student);
Agora, este objeto POJO está em estado persistente .
(Ponto de vista do coletor de lixo - o GC não pode eliminar qualquer objeto que esteja no estado persistente. Portanto, podemos dizer que o estado persistente é como um armazenamento temporário para objetos POJO )
Se executarmos->
session.beginTransaction.commit();
então o objeto POJO está em estado de armazenamento Permanente ou Banco de Dados
(Ponto de vista do coletor de lixo - GC não pode eliminar este objeto porque este objeto POJO agora está fora do escopo da JVM e armazenado na tabela de formulário dentro de um banco de dados. Então, podemos dizer que este estado de armazenamento de banco de dados é como armazenamento permanente para POJO objetos )
Se executarmos->
session.evict(student);
em seguida, o objeto POJO é removido ou removido de volta do estado persistente para o estado separado. Portanto, este estado do objeto POJO é o estado separado .
(Ponto de vista do coletor de lixo - o GC pode facilmente apagar o objeto POJO de estado separado da JVM)
Dada a seguinte entidade:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
Da documentação do Hibernate 5.2 (também incluí o removed
estado):
transitório
a entidade acaba de ser instanciada e não está associada a um contexto de persistência. Ele não tem representação persistente no banco de dados e normalmente nenhum valor de identificador foi atribuído (a menos que o gerador atribuído tenha sido usado).
City city = new City();
gerenciado ou persistente
a entidade possui um identificador associado e está associada a um contexto de persistência. Ele pode ou não existir fisicamente no banco de dados ainda.
// 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
a entidade tem um identificador associado, mas não está mais associada a um contexto de persistência (geralmente porque o contexto de persistência foi fechado ou a instância foi removida do contexto)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
removido
a entidade possui um identificador associado e está associada a um contexto de persistência, no entanto, está programada para remoção do banco de dados.
session.remove(city);
Nota:
Hibernate API oferece pares de métodos para alternar entre estados de entidade, e eu acho que vale a pena explorar uma classe Hibernate Session .
Ao lado da resposta correta já identificada persistente, transiente, destacado são apenas o estado do objeto em hibernação.
Para ser mais preciso, esses três estados realmente mostram as alterações do objeto de hibernação e o status do ciclo de vida da sessão