terça-feira, 17 de julho de 2007

Persistência de Dados com Hibernate

O Hibernate é uma ferramenta para o Mapeamento Objeto-Relacional escrito na linguagem Java, mas também é disponível em .Net como o nome NHibernate. Este programa facilita o mapeamento dos atributos entre uma base tradicional de dados relacionais e o modelo objeto de uma aplicação, mediante o uso de arquivos (XML) para estabelecer esta relação.

O objetivo do Hibernate é diminuir a complexidade entre os programas Java, baseado no modelo orientado a objeto, que precisam trabalhar com um banco de dados do modelo relacional (presente na maioria dos SGDBs). Em especial, no desenvolvimento de consultas e atualizações dos dados.

Sua principal característica é a transformação das classes em Java para tabelas de dados (e dos tipos de dados Java para os da SQL). O Hibernate gera as chamadas SQL e libera o desenvolvedor do trabalho manual da conversão dos dados resultante, mantendo o programa portável para quaisquer bancos de dados SQL, porém causando um pequeno aumento no tempo de execução.

Nas questões relacionadas para o gerenciamento de transações e na tecnologia de acesso à base de dados são de responsabilidade de outros elementos na infrestrutura do programa. Apesar de existirem API no Hibernate para possuir operações de controle transacional, ele simplesmente delegará estas funções para a infrestrutura na qual foi instalada.

No caso de aplicações construídas para serem executadas em servidores de aplicação, o gerenciamento das transações é realizado segundo o padrão JTA. Ja nas aplicações standalone, o programa delega o tratamento transacional ao driver JDBC.

Hibernate pode ser utilizado em aplicações Java standalone ou em aplicações Java EE, utilizando servlet ou sessões EJB beans.

Persistência de Dados

A Persistência de Dados consiste no armazenamento confiável e coerente das informações em um sistema de armazenamento de dados.

Na Orientação a Objetos, chama-se de "objetos persistentes" aqueles que permanecem existindo mesmo após o término da execução do programa. Associados à persistência estão o gerenciamento dinâmico da memória e o armazenamento de objetos em bases de dados. — Somente é possível "eternizar" um objeto quando este não possui "dados dinâmicos" (runtime), ou seja, dados que só fazem sentido no contexto do tempo em que estão executando, como sockets, por exemplo. Os objetos que possuem dados de tempo de execução, se congelados, após sua recuperação os dados que não fazem mais sentido no contexto do novo tempo são ignorados ou perdidos.

Persistindo Objetos com Hibernate

Como um programador Java, muito provavelmente, em algum momento haverá a necessidade de guardar e recuperar as informações dos objetos em algum local. Na maioria dos casos essas informações, tanto de objetos quanto de componentes, serão armazenados em um banco de dados relacional.

Para usar um banco de dados relacional com o intuito de manter os objetos armazenados, um programador poderia perder muito tempo no ajuste do modelo OO (Orientado a Objeto), para o modelo Relacional em tabelas. Esse processo pode ser demorado, pois depende de alguns fatores incluindo os seguintes:

  • Quanto o esquema relacional está próximo do modelo OO;
  • O esquema representa a aplicação;
  • O esquema é padrão, ou seja, possui chaves primárias;
  • Qual o grau de normalização se encontra o esquema;
  • Quanto o esquema influência o modelo OO e a interface com o usuário( e vice versa);

Alguns puristas do paradigma orientado a objetos poderiam argumentar que a modelagem do domínio do negócio não deveria ser influenciado por detalhes de implementação tais como, onde o objeto deveria está armazenado se não estiver na memória. Por outro lado, um modelador de banco de dados poderia afirmar que o modelo de dados deveria perdurar a vida da aplicação por muito tempo e que o design do sistema deveria ser concentrado na eficiência de armazenamento e acesso aos dados.

Ambas as visões tem suas particularidades, mais quando pensamos no desenvolvimento de um sistema, devemos primar pela agilidade e produtividade. Dessa forma, uma excelente saída para esse conflito de idéias, é colocar em ação as melhores práticas dos modeladores de objetos e dos modeladores de banco de dados. Assim asseguramos um modelo bem definido do domínio do problema além de manter a integridade, reusabilidade, e um eficiente uso dos dados.

Object-relational mapping (ORM) é o nome dado para tecnologias, ferramentas e técnicas usadas para ligar os objetos aos banco de dados relacional. Isso significa que estaremos construindo uma camada extra para persistir os objetos no repositório, ou seja, criaremos uma camada de persistência. Este modelo nos possibilita criar mapeamentos dos objetos entidade para seus respectivos dados e relacionamentos nos banco de dados. Esta geração de ferramentas gera todo o SQL necessário para recuperar, armazenar, atualizar, deletar as informações para cada objeto mapeado.

O Hibernate é uma excelente ferramenta open source que possibilita essa forma de trabalho, ou seja, ele é uma ferramenta que possibilita a persistência transparente de objetos Java. Persistência transparente, dita anteriormente, quer dizer que os objetos não tem nenhum código que expõe a habilidade de ser persistido no repositório, ao contrário de como acontece com os Entity Beans.

No Hibernate, o mapeamento entre os objetos e as tabelas pode ser implementado através de arquivos XML, código Java ou via JSR-220 Persistence Annotation. O sucesso do Hibernate está centralizado na simplicidade, onde o coração de toda a interação entre o código e o banco de dados utiliza o Hibernate Session.

Abaixo segue um esquema de como o Hibernate trabalha.




O Hibernate Session incorpora o conceito de serviço(ou gerenciador de persistência – Persistence Manager) que pode ser usado para consultas e executar operações de inserção, atualização e remoção na instancia de uma classe mapeada pelo Hibernate. Em ferramentas do tipo ORM, executa-se todas essas interações na semântica orientada a objetos, ou seja, não se reportando as tabelas e colunas, mas sim a classes e propriedades dos objetos Java.

Como o Hibernate dá a possibilidade de conectar-se a vários banco de dados, é necessário fornecer as informações requeridas para conectar ao banco de dados, assim como cada classe deverá ser mapeada para cada banco de dados. Cada uma dessas configurações e mapeamento de classes serão compiladas e armazenadas pelo SessionFactory. O SessionFactory deverá ser instanciado apenas uma vez.

Cada SessionFactory é configurado para uma determinada plataforma de banco de dados através dos Hibernate dialects. O Hibernate possui uma imensa variedade de dialects, desde TimesTenDialect (Alguém por acaso conhece esse banco de dados?) até os mais tradicionais como PostgreSQLDialect e OracleDialect. Abaixo segue a arquitetura de dialects disponibilizados pela Hibernate. Cada dialect está disponível no pacote org.hibernate.dialect.

O Hibernate especifica como cada objeto será retornado ou armazenado no banco de dados através de um arquivo de configuração XML. Os mapeamentos são lidos ao iniciar a aplicação e armazenados em cache numa SessionFactory. Cada mapeamento especifica uma variedade de parâmetros referentes ao ciclo de vida das instâncias dos mapeamentos, tais como:

  • Chave Primária
  • Mapeamento dos campos dos objetos com seus respectivas colunas nas tabelas.
  • Associações / Coleções
  • Configurações sobre cache
  • Chamadas a Store Procedores, filtros, consultas parametrizadas, entre outras.

Tendo o Hibernate iniciado sem problemas e com os objetos mapeados, devemos estar cientes dos estados de cada objeto instanciado. Há três estados possíveis para um objeto. O entendimento destes estados e as ações que os modificam, serão de muita importância quando se depararem com algum problema. Não entrarei mais a fundo sobre esse aspecto mas deixarei uma visão superior sobre os estados e as ações que os precedem com a figura seguinte:




  • Transient : Objeto em memória porém não foi salvo ainda;
  • Persistent : Objeto já salvo porém em cache no SessionFactory mas pode ser que ainda não esteja no banco de dados;
  • Detached : Objeto já persistido no banco de dados;

Fonte: http://pt.wikipedia.org/wiki/Hibernate
http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149

0 comentários:

by TemplatesForYou
SoSuechtig,Burajiru