[Resolvido] O Objeto precisa estar na Sessão para ser deletado ou alterado?

8 respostas
InsaneChess

Prezados,
Estou estudando um pouco de hibernate, por quê fiquei um tempinho parado sem mecher com ele desde meu último serviço.
Pelo que eu lembrava…O objeto precisava ser consultado antes ao banco para depois ser alterado ou deletado.

Porém em meus testes aqui, eu posso criar qualquer objeto fora da Sessão por um ID qualquer que esteja no banco e mandar o Hibernate apagar ou dar update que funciona.

Alguém pode me citar algums exemplos de erros que acontece quando se tenta trabalhar com objetos fora da Sessão?
Se possível de maneira detalhada, por quê estou tentando simular tudo…pra reelembrar.

Eu lembro que sempre tinha de corrigir erros com objetos fora da Sessão, agora sozinho aqui em casa não consigo fazer nenhum erro desse tipo >.<
HsuahuHusa

Valew!!!

8 Respostas

FernandoFranzini

É isso mesmo…nos frameworks ORM…os objetos precisam estar dentro da sessão aberta de persistência. Isso é descrito no JPA como estado MANAGED. Isso acontece pq vc tem a liberdade de desconectado da sessão aberta para trabalhar com ele OFF enviado para outras camadas da aplicações, principalmente aquelas remotas.

R

Infelizmente a semântica é diferente no Hibernate e no JPA. O Hibernate permite excluir uma instância via Session.delete() sem que a instância esteja carregada na sessão, mas em JPA a chamada EntityManager.remove() exige que a instância tenha sido carregada previamente (isto pode ser feito via EntityManager.find()). Quanto a erros por trabalhar fora da sessão, o erro que mais cometo é usar um método getXxxx() para ler uma entidade associada de uma instância qualquer depois de ter fechado a sessão que gerou esta instância. Dependendo do modo como a classe da instância foi mapeada, o método getXxxx() vai gerar uma leitura no banco para ler a entidade associada, mas a leitura vai falhar porque a sessão já foi fechada.

Hebert_Coelho

Quando você ver as palavras em Detached Exception em algum erro saiba que é pq você está trabalhando com o objeto fora da sessão.

E também quando você ver o erro LazyException é por que você tentou acessar uma lista de um objeto sendo que a lista não está EAGER e fora da sessão.

A sessão realmente é necessária para diversas ações. O merge do JPA por exemplo não necessita de que o objeto esteja dentro da sessão previamente. [=

InsaneChess

Desculpe, não intendi direito…
JPA não é a especificação que o Hibernate segue?

R

Você pode usar o Hibernate de duas maneiras diferentes: a primeira é o que poderíamos chamar de Hibernate “clássico”, que não tem nada a ver com JPA, em que você usa basicamente os objetos SessionFactory e Session. A segunda é o Hibernate como implementação da especificação JPA, em que você usa basicamente os objetos EntityManagerFactory e EntityManager. Assim, o Hibernate pode ser usado como uma implementação da especificação JPA, mas também da maneira original, que foi concebida muito antes da elaboração da JPA.

ViniGodoy

Por favor, no título dos tópicos, não banalize tags informativas como [Resolvido] usando para dizer o óbvio como [Dúvida], [Problema], [Ajuda].

InsaneChess

Ok, muito obrigado a todos.
Godoy, desculpe. Coloquei a devida Tag no assunto do tópico.

R

Desculpe, não intendi direito…
JPA não é a especificação que o Hibernate segue?

Correto.

Só que:algumas funcionalidades vc pode implementar tanto com JPA quanto usando a API da implementação(Hibernate no caso).

Criado 31 de outubro de 2011
Ultima resposta 3 de nov. de 2011
Respostas 8
Participantes 6