segunda-feira, 18 de fevereiro de 2013

Ciclo de vida do Hibernate

O Hibernate é um framework ORM (mapeamento objeto-relacional) - inserindo, removendo ou atualizando registros em tabelas de banco de dados, dependendo de operações feitas sobre objetos de persistência associados a essas tabelas.

Além de abstrair as operações feitas sobre o sistema de banco de dados utilizado, é possível gerenciar os estados dos objetos manipulados pelo framework. Dessa forma, os desenvolvedores devem sempre ter em mente o estado de seus objetos, e não necessariamente a execução de comandos SQL (esse tipo de preocupação aparece mais em processos de "tuning" da aplicação).

Os objetos de persistência manipulados pelo Hibernate possuem 3 estados: "transient", "persistent" e "detached":

  • Um objeto é transiente se ele acabou de ser instanciado (através do operador "new") e não está associado a um objeto "Session" do Hibernate. Ele não tem uma representação na base de dados e nenhum identificador foi associado a ele. Essas instâncias serão destruídas pelo "Garbage Collector" se a aplicação não mantiver mais uma referência para elas.
  • Pessoa pessoa = new Pessoa();
    pessoa.setName("João");
    //objeto Pessoa está no estado 'transient'
    

  • Um objeto persistente tem uma representação na base de dados e um identificador associado a ele. Ele pode ter sido acabado de ser salvo ou carregado e está no escopo do objeto "Session". O hibernate vai detectar qualquer alteração feita no objeto e atualizar a base de dados assim que possível (operação de "flush" dos dados).
  • Long id = (Long) session.save(pessoa);
    //objeto Pessoa agora está no estado 'persistent'
    

  • Um objeto "destacado" ou "separado" foi persistente, mas sua sessão ("Session") foi fechada. A referência para o objeto ainda existe e ele ainda pode ser alterado. Mais tarde, uma instância desse tipo pode ser "religada" a um novo objeto "Session" e suas atualizações podem então ser persistidas novamente.
  • session.close();
    pessoa.setName("João Paulo");
    //objeto Pessoa está no estado 'detached'
    

Obs.: Alguns autores colocam ainda o estado "removido" ("removed") como sendo um quarto estado. Embora possa-se também dizer que o método "delete()" coloque um objeto persistente no estado transiente novamente.

A figura abaixo apresenta os estados descritos e possíveis operações envolvidas nas mudanças de estados.

Não convém, nesse momento, detalhar cada uma dessas operações; mas já se pode ter uma boa noção do ciclo de vida dos objetos de persistência manipulados pelo Hibernate em uma aplicação.

Nenhum comentário: