terça-feira, 15 de dezembro de 2009

Seu objeto está na sessão? Entenda o conceito Attached e Dettached Objects!

Esta manhã respondi no RioJUG uma dúvida sobre JPA que achei interessante registrar aqui no blog:

Em JPA, é interessante jogar uma luz sobre um importante conceito: attached/dettached objects. Quando um objeto persistente participa de uma sessão que ainda está ativa, ele se encontra no estado "attached". Depois que a sessão é encerrada (session.close() ou entitymanager.close()), o objeto passa para o estado "detached".

Basicamente, no estado detached, não há mais conexão com o banco, portanto nenhuma alteração realizada no objeto será efetivada no BD, e o objeto não pode mais tentar carregar informações adicionais do banco (por exemplo associações lazy que não tenham sido acessadas durante a sessão).

Estou falando isso, pois o conceito está diretamente vinculado ao papel da chamada merge:

o método recebe um objeto dettached, e retorna o objeto correspondente, vinculado à sessão. Quando o objeto dettached for uma nova entidade, o ORM em algum momento (não necessariamente no momento da chamada) irá realizar um insert no banco de dados. Caso seja uma entidade existente, é interessante obtê-lo através de uma chamada find:

Note que, pelo find, o objeto já é retornado participando da sessão. Uma vez que o objeto já participe da sessão, você pode continuar populando as propriedades desse objeto (attached.setXXX, attached.setYYY), todas as alterações feitas o objeto, DURANTE A SESSÃO serão efetivadas no banco. Resumindo: as alterações realizadas no objeto enquanto ele participa da sessão serão efetivadas no BD.

É legal fazer o seguinte teste: carregue um objeto que já esteja no BD, e realize as alterações nesse objeto. Ao final, apenas feche a sessão, sem a chamada em.merge (ela não é necessária, pois o objeto já estava attached). Logicamente dê commit na transação, caso aplicável. Depois verifique se as alterações foram efetivadas.

Por fim, o JPA fica muito mais divertido e produtivo quando entendemos melhor seu mecanismo de funcionamento, o ciclo de vida dos objetos, pois mapeamento objeto-relacional é seu conceito-base, mas seu poder é com certeza mais amplo.

Nenhum comentário:

Postar um comentário