Atenção: esse artigo tem um vídeo complementar. Clique e assista!

Artigo no estilo: Curso

De que se trata o artigo:

Neste artigo veremos como utilizar os recursos do Hibernate, agora em sua versão 4, para facilitar e dinamizar a persistência de objetos em aplicações Java.

Em que situação o tema útil:

A integração com bancos de dados relacionais é muito presente no contexto de desenvolvimento Java, e compreender as ferramentas e recursos disponíveis para realizar esta tarefa da melhor forma possível é fundamental.

Resumo DevMan:

Desenvolvimento de software integrado com banco de dados é muito comum no mercado Java, e o Hibernate é um framework muito adotado por equipes de desenvolvimento para tratar este cenário. Ao utilizarmos o Hibernate, podemos vincular classes de nosso modelo OO a tabelas, permitindo que operações como inclusão, remoção, consulta e alteração de objetos sejam realizadas facilmente.

Com o surgimento da computação e o crescimento do software como parte integrante do cotidiano das organizações, o ser humano tem buscado melhores formas de comandar um computador para realizar algum comportamento desejado.

Um dos avanços nesta área é a definição dos paradigmas de programação, dentre os quais ressaltamos o orientado a objetos, no qual a linguagem Java é baseada e é muito utilizado para o desenvolvimento de aplicações comerciais.

Paralelamente, procurando como melhor administrar informações de um sistema, surgiram os bancos de dados – aplicações específicas para facilitar e unificar o armazenamento dos dados de um software. Da mesma forma que surgiram os paradigmas de programação, alguns modelos de bancos de dados foram propostos, dentre os quais o modelo relacional, que é baseado em tabelas e é o predominante no mercado.

Tendo em vista a situação atual da indústria de desenvolvimento de software, é muito comum desenvolvermos sistemas em Java interagindo com algum banco de dados relacional. Portanto, como bons programadores, devemos buscar compreender os recursos tecnológicos disponíveis para realizarmos este tipo de integração da melhor maneira possível, sem perder os recursos da orientação a objetos disponíveis na linguagem.

Uma das melhores maneiras de se utilizar um banco de dados relacional para armazenar nossas informações sem perder as vantagens do paradigma orientado a objetos é empregando frameworks ORM (Object-Relational Mapping ou Mapeamento Objeto-Relacional).

Um framework ORM muito utilizado em aplicações Java é o do projeto Hibernate. Ele foi construído para facilitar as operações de persistência de objetos em bancos de dados relacionais através da geração automática de comandos SQL a serem executados por meio de uma conexão JDBC. Hoje o Hibernate consiste em um conjunto de projetos que abordam diferentes necessidades correlatas para a linguagem Java.

No contexto deste artigo, iremos tratar exclusivamente do projeto ORM, que se foca no mapeamento objeto-relacional para Java. O surgimento e evolução deste projeto (ORM – antigo hibernate core) influenciou na criação da JPA (Java Persistence API), a especificação atual do Java Enterprise Edition para persistência em bancos relacionais.

Hoje, diversas aplicações utilizam o Hibernate diretamente ou através da API do JPA. Utilizar este framework através desta API possui algumas vantagens, como a possibilidade de se alterar a implementação do mecanismo de persistência e ainda se manter na padronização de persistência do Java EE. Apesar desta vantagem, o Hibernate possui diversos recursos que não estão contemplados na especificação JPA. Conhecer estes recursos permite maior controle sobre o framework e, consequentemente, mais possibilidades em sua utilização.

Ao estudar suas funcionalidades próprias, além da especificação JPA, devemos estar atentos também à evolução do framework, para acompanhar suas novidades e compreender como melhor utilizá-las. Ao analisar o Hibernate 4, versão ainda nova e com poucos recursos conhecidos no mercado, poderemos notar que algumas novidades surgiram para simplificar alguns cenários avançados em relação à persistência de objetos. Dentre elas, as que mais se destacam são o suporte do framework no isolamento de dados de clientes diferentes (Multitenancy), o mecanismo de substituição e alteração de comportamento em serviços internos do Hibernate (Services) e a alteração do mecanismo de logs para o JBoss Logging, permitindo logs internacionalizáveis.

Além destes itens, foram realizadas alterações no projeto como uma nova organização dos metadados de mapeamento, mais precisamente a inclusão da classe MetadataSources. Porém o desenvolvimento deste recurso ainda não está finalizado e, portanto ainda não está estável para utilização. Recentemente foi lançada a versão 4.1 do Hibernate, que trouxe um mecanismo integrado de histórico e auditoria de dados, o Envers.

Nesta parte inicial de uma série de artigos, iremos tratar de como utilizar o Hibernate para a persistência de uma aplicação Java, passando pela configuração do framework, a persistência básica, mecanismos de recuperação de objetos, relacionamentos entre objetos e o efeito cascata nas operações de persistência. Também discutiremos alguns problemas muito encontrados em aplicações Java relacionados à persistência, como o anti-pattern denominado modelo anêmico (AnemicDomainModel) e o encapsulamento das operações do sistema, juntamente com exceções de carregamento lazy.

Nas partes subsequentes desta série, abordaremos o assunto controle de transações em aplicações web, com a opção do padrão Open Session In View. Além disso, discutiremos recursos mais avançados e as novidades mais interessantes relacionadas ao Hibernate 4, como por exemplo o mecanismo de serviços internos do Hibernate, exemplificando como injetar o comportamento de controle de conexões em um caso de testes funcionais automatizados. Mostraremos também uma das maiores novidades desta versão, o suporte nativo à administração de dados isolados para cada cliente através do conceito de Multitenancy. Também iremos tratar sobre como criar filtros do Hibernate (Filters), a definição de tipos personalizados (UserTypes), o mecanismo de auditoria por meio do Envers, novidade do Hibernate 4.1, além das alterações de logging fazendo uso do JBoss Logging.

Exemplo básico

Para prepararmos um ambiente básico para utilização do Hibernate, iremos criar um projeto Java comum no Eclipse, em que poderemos executar a maioria dos exemplos aqui descritos. Para demonstrar alguns cenários de uso deste framework, simularemos a persistência de objetos no desenvolvimento de algumas funcionalidades de um sistema de Fórum.

O primeiro passo é baixar os arquivos JAR necessários para o funcionamento do Hibernate ORM no site do projeto (http://sourceforge.net/projects/hibernate/files/hibernate4/). Para a execução deste artigo, utilizaremos o Hibernate ORM 4.1.0-Final. Após o download do pacote ZIP, iremos descompactá-lo e adicionar todos os arquivos JAR do diretório required em nosso projeto no Eclipse.

No exemplo, também empregaremos o MySQL. Portanto, para a execução dos códigos demonstrados, é necessário tê-lo instalado em sua máquina. Além da instalação do MySQL, também é necessário baixar o driver de conexão JDBC (mysql-connector-java) e adicioná-lo ao projeto no Eclipse, para que assim possamos acessar o banco de dados por meio de nossa aplicação Java.

Um exemplo de configuração adequada dos arquivos JAR pode ser observado na Figura 1.

Bibliotecas
necessárias para execução do exemplo no Eclipse

Figura 1. Bibliotecas necessárias para execução do exemplo no Eclipse.

Ao preparamos adequadamente um projeto com o Hibernate, é necessário realizarmos algumas configurações. Em uma configuração inicial para persistência básica de objetos, utilizaremos os recursos que já estavam disponíveis nas versões anteriores do framework. O uso de alguns mecanismos mais avançados nesta configuração, como é o caso do gerenciamento dos serviços internos do Hibernate, serão tratados posteriormente nos próximos artigos desta série.

No sistema exemplo, nos concentraremos por enquanto nas funcionalidades relacionadas com a manipulação de usuários e de assuntos para discussão em nosso fórum. Para isso, primeiramente temos a necessidade de administrar os dados de todos os usuários, e consequentemente possuir uma classe que representa estas instâncias, bem como uma tabela em nosso banco de dados para armazenar estes dados. Inicialmente, armazenaremos apenas o nome, o e-mail e a senha dos usuários.

Para definir um modelo inicial de classes levando em consideração estas informações, precisamos compreender o funcionamento básico do Hibernate ORM. Dentre outros recursos, este framework permite que ao criarmos as classes (característica do paradigma orientado a objetos) possamos associá-las a tabelas no banco de dados (característica do modelo relacional), o que caracteriza o mapeamento objeto-relacional.

Este mapeamento realizado pelo Hibernate pode ser configurado de diversas formas. Dente elas, as mais populares são a utilização de anotações do próprio framework e da especificação JPA, e a definição do mapeamento de persistência por meio de arquivos XML. Neste artigo daremos preferência ao mapeamento por anotações.

Para trabalhar com usuários em nosso sistema, criaremos inicialmente uma classe Usuario e adicionaremos anotações na mesma para indicar ao Hibernate que esta é uma classe que representa uma entidade no banco de dados e, portanto deve ser associada a alguma tabela. Para fazermos isso, anotaremos esta classe com a anotação @Entity do JPA, bem como criaremos um campo para representar a chave primária de nossa tabela, neste caso um atributo numérico anotado com ...

Quer ler esse conteúdo completo? Tenha acesso completo