O que são objetos separados, persistentes e transitórios em hibernação?

100

O que são objetos separados, persistentes e transitórios em hibernação? Explique com um exemplo.

Jigar Joshi
fonte
em session.close não removerá todos os objetos que eram persistência no escopo da sessão?
Jigar Joshi
Sim, ele será removido, então sempre que você fechar uma sessão, o estado persistente de um objeto é convertido para o estado Desanexado.
Rachel
@Rachel link legal fornecido com código para um entendimento mais profundo
Priyank Thakkar

Respostas:

161

Uma newinstâ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 closeo 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 Sessionposteriormente).

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.

Pascal Thivent
fonte
Um valor de identificador provavelmente não é uma condição estrita para um objeto ser persistente, já que eu poderia usar a estratégia de geração de identificador atribuído.
Abhijeet Kashnia
Além de fechar a sessão que leu na instância, pode-se desanexar uma instância chamando session.evict (). Isso o remove de ser gerenciado pelo Hibernate (evitando que as alterações na instância sejam propagadas automaticamente de volta para o banco de dados). Você pode enviar alterações ao banco de dados por meio de session.update () e anexá-lo novamente com session.merge ().
Mooshu
1
Muitas vezes não seguimos os documentos originais fornecidos pelos frameworks .. que às vezes têm informações ocultas com a descrição adequada, apenas precisam ser explorados. o problema é que não o encontramos facilmente :)
agpt
A persistent instance has a representation in the databaseUma entidade persistente não tem uma representação no banco de dados antes de confirmar a operação de salvamento.
O.Badr
1
Assim, a diferença de entidade separada e transitória é a presença de ID ? Se eu criar uma nova instância com id atribuído, formalmente é transitório, porque não é persistente ainda, mas não pode ser distinguido de desanexado, porque tem um ID. Certo?
Ruslan Stelmachenko
9

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

Sk Sharma
fonte
5

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-

  1. Estado transiente
  2. estado persistente
  3. estado separado

É 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)

Sabunkar Tejas Sahailesh
fonte
2

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 removedestado):

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 .

O.Badr
fonte
0

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

Amol Dixit
fonte