Hibernate


Antes de concluir o tema hibernate, quero comemorar com todos, os mais de 1.000 acessos que no nosso blog conquistou e por isso arrumei um tempinho para atualizar o visual do site….e que venham os 5000, 10 000, 100 000 acessos !

 

E voltando ao Hibernate, vamos concluir o tema mostrando um exemplo prático e clássico de como resolver as relações entre os objetos que reflitam os relacionamentos e cardinalidades das entidades de uma base de dados. O hibernate permite representar os diversos mapeamentos possíveis como um-para-um, um-para-muitos, muitos-para-muitos,  também com o auxílio dos arquivos hbm.xml que exemplificamos no post anterior.

 

O exemplo abaixo , utilizando as mesmas entidades dos posts anteriores, mostra como resolver uma relação com cardinalidade um-para-muitos  entre Produto e seus Itens.

 

hibernatesource4.gif

 

O Set, que está em vermelho, é uma lista que será preenchida por todos os objetos ItemProduto que tenham a relação atendida pela coluna PRODUTO_SQ, que na entidade do BD correspondente, será uma FK na tabela de Itens de Produto. A cláusula “lazy” permite que os “objetos filhos” sejam carregados ou não, no momento que um “objeto pai” seja recuperado da base.

O default para essa propriedade é false, ou seja,  sempre que um Produto for carregado todos os seus Itens também o serão, mas isso pode acarretar em uma perda de performance quando trabalhamos com tabelas de muitos registros (milhares) então, a literatura sugere que ao existir essa condição o “lazy” deve ser true, isso que dizer que os Itens do Produto, só serão recuperados da base quando for executado o método produto.getListaItensProdutos(). 

Esse é o um dos grandes diferencias do Hibernate, permite que o “trabalho sujo” do programador seja minimizado e que seu esforço de desenvolvimento seja desprendido nas regras de negócio do seu projeto.

 

Por fim , seguem algumas das referências que sempre utilizo nas horas de estudar, aprender mais e  descobrir os bugs :

Site oficial

http://www.hibernate.org/

Guia de Referencia:

{Diretorio de Intalação }\hibernate-3.0\doc\reference\en\pdf\ hibernate_reference.pdf

Tradução não oficial para português do guia de referência:

http://sourceforge.net/projects/hibrefptbr ( lá você pode baixar o mesmo pdf acima) – descobri isso ontem a noite lendo uma revista.

 

 ”Ah  e não esquecer obviamente do www.google.com” !!!!!

 

Bom, o intuito dessa série foi introduzir alguns dos conceitos do Hibernate e espero que vocês tenham gostado e que se aprofundem nos conhecimentos……e até a próxima.

 

 

Dando continuidade ao tema hibernate, neste post, vamos traçar um paralelo entre o mapeamento O/R com e sem a utilização do hibernate, mostrando os principais ganhos no uso desse framework.

Quem já trabalha ou trabalhou com java, sabe que fazer o mapeamento de objetos aos ResultSets do JDBC, com as tuplas obtidas de uma consulta em um banco de dados, é um trabalho repetitivo, criterioso e que gera muita codificação. O trecho de código abaixo dá um exemplo disso:

 

hibernatesource1.gif

 

 

Observamos que para cada elemento que será retornado do BD, uma nova instancia do objeto é criada, preenchida e adicionada a uma lista (padrão comumente utilizado em projetos). Por fim uma nova instância da coleção é criada e recebe a lista preenchida para ser retornada para quem consumiu o método. Lembrando que o consumidor do método terá que extrair dessa coleção os objetos , fazer o casting para o objeto desejado, para em seguida acessar os atributos desejados.

No trecho abaixo, agora com o Hibernate, veja como o mesmo método foi implementado:

 

 

hibernatesource2.gif

 

Observamos agora, algumas das importantes características do código utilizando Hibernate. Na linha 1, inicia-se uma transação: é aconselhável sempre se trabalhar com esse conceito permitindo o trabalho de transações integradas com o gerenciador de BD; Na linha 2, obtem-se uma sessão gerenciada pela classe utilitária HibernateUtil; Na linha 3, o objeto Criteria, permite mapear os atributos de uma classe que o engine do hibernate irá converter para uma HQL (Hibernate Query Language), semelhante a um comando SQL. Esse ponto é especial pois deixamos de trabalhar com as tabelas, ou seja, sempre nos referimos às intâncias dos objetos e seus atributos na hora de criar consultas especializadas.

Na linha 4, cria-se dinamicamente uma ordenação para o resultado da consulta, utilizando-se o método addOrder e o objeto Order ordenando ascendentemente pelo atributo da classe “descrição”; Na linha 5, a consulta é efetivamente executada, retornando uma lista de objetos do tipo da classe passada no Criteria (Produto).;Na linha 6, a sessão com o banco é liberada e por fim na linha 7, a transação é “comitada”.

Por fim, nota-se que não foi necessário fazer o trabalho de mapeamento dos dados da base para os objetos java, porque o hibernate faz isso de forma “quase automática”. E isso não é mágica, existem arquivos de configuração e mapeamento que fazem isso para o desenvolvedor.

O arquivo produto.hbm.xml(abaixo), que mapeia os atributos da classe aos atributos da tabela do BD. Alem dos arquivos de hibernate.properties e hibernate.cfg.xml que contem respectivamente as informações de acesso ao BD (usuário, senha, esquema, etc) e configurações adicionais do hibernate.

hibernatesource3.gif

No próximo e ultimo post falaremos um pouco mais sobre essas funcionalidades, mais especificamente, sobre as relações entre os objetos e suas cardinalidades e dicas de literatura para aprofundamento dos conhecimentos.
Até lá !

Dando continuidade ao tema hibernate, neste post, vamos falar um pouco sobre suaa arquitetura e suas principais caracterísiticas.

A API do Hibernate está dividida em duas camadas que são aderentes à J2EE API. Existe a camada de negócios (Business Layer) que garante o ciclo de vida dos objetos, suas validações e as classes que serão responsáveis pela persistência, a ser gerenciada pela camada de persistência (Persistence Layer).

Os componentes responsáveis pelo gerenciamento de sessão, transação, queries, fábrica de sessões e configurações são parte integrante da camada de persistência. A imagem abaixo ilustra essa arquitetura.

hibernate1.gif

É possível utilizar o Hibenate rodando em uma ambiente stand alone , como também , num ambiente gerenciável , através do uso de containers como WAS, JBOSS , BES, TOMCAT.A figura abaixo exemplifica de forma simples e objetiva como funciona o hibernate em um

ambiente não gerenciado.

hibernate2.gif

Na próxima figura , está o exemplo de como funciona o hibernate no ambiente gerenciado, adicionando as características de controle que um Aplication Server permite.

hibernate3.gif

 

Mas para que se possa utilizar o Hibernate de forma adequada e correta, é preciso entender um conceito muito importante que permeia todo o ciclo de vida de um projeto que o utilizará. Existem estados e transições que devem ser considerados como exemplificado na figura abaixo.

 

hibernate4.gif

Transiente (Transient)– o objeto ainda não foi persistido na base , ou seja, esse seu estado indica que o objeto só existem em memória.

Persistente (Persistent)– o objeto foi salvo no BD em uso, e já poderá ser acessado de lá.

Desatachado (Detached)- o objeto não é mais utilizado e será liberado para descarte pelo gerenciado de lixo (Garbage Collector)

 

Trazendo uma atualização para Java EE 5 , o Hibernate implementa Entity Mananger, Annotations , Core e Seam e para quem trabalha com .NET da microsoft o NHibernate implementa .NET 2.0 também.

 

No próximo post, faremos um exemplo prático sobre o uso do hibernate , exemplificando como seria sua utilização e mostrando a diferença para o modo tradicional de mapeamento O/R em java.

Hoje vamos iniciar uma série de três post’s falando sobre um dos principais, senão o principal, framework de mapeamento e persitência O/R para quem trabalha com Java e também .NET !

Um dos principais desafios para quem trabalha com java, por exemplo, é fazer o trabalho árduo de mapeamento dos objeto para relacional viabilizando a persistência dos dados em um BD. Existem diversos frameworks no mercado como iBatis (Projeto da Apache para mapeamento O/R para os ambientes Java e .NET) mas o mais conhecido e famoso é o Hibernate.

nHIBERNATE

Projeto do Grupo JBoss para agilizar e facilitar o mapeamento OR para Java e .NET (NHibernate), para a maioria dos BD´s de mercado (pagos ou gratuitos).

Dentre suas principais propostas está a diminuição do trabalho no mapeamento O/R, aumentando assim a produtividade, manutenibilidade, performance e independência de Bancos de Dados. Utiliza arquivos de mapeamento , no formato hbm.xml, e de configurações, no formato .properties, que permitem associar e gerir objetos às tabelas de um BD Relacional.

No próximo post falaremos a fundo sobre a arquitetura do hibernate e suas principais características….