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 =newPerson();
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.
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.
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-
Estado transiente
estado persistente
estado separado
É melhor entender com um exemplo de código
Vamos considerar uma classe POJO como Objeto do Aluno->
Student student =newStudent();
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)
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 =newCity();
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 .
Respostas:
Uma
new
instância de uma classe persistente que não está associada a umSession
, não tem representação no banco de dados e nenhum valor de identificador é considerada transitória pelo Hibernate: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 aSession
:Agora, se fizermos
close
o HibernateSession
, a instância persistente se tornará uma instância desanexada : ela não está mais anexada a umSession
(mas ainda pode ser modificada e reanexada a uma novaSession
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.
fonte
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
fonte
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->
Agora, este objeto de aluno está em estado transiente .
Quando anexamos este objeto POJO para hibernar a sessão->
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->
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->
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)
fonte
Dada a seguinte entidade:
Da documentação do Hibernate 5.2 (também incluí o
removed
estado):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 .
fonte
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
fonte