Guia de Linguagem

Hibernate


Neste Guia de Referência você encontrará cursos, devcasts e artigos que demonstram todos os recursos do Hibernate. Entre eles, é claro, como persistir dados em Java com o framework ORM mais utilizado pelos desenvolvedores.

Introdução ao Hibernate

Hibernate é o framework para persistência de dados mais utilizado em projetos Java. Sendo uma das primeiras opções a implementar o conceito de mapeamento objeto-relacional (ORM), em pouco tempo se tornou referência entre os desenvolvedores, tendo influenciado, inclusive, a criação da especificação JPA.

Mas afinal, o que é a JPA? JPA é a especificação do Java que dita como os frameworks ORM devem ser implementados. Ela foi criada com o intuito de padronizar essas soluções. Antes de sua criação existiam diversos frameworks e bibliotecas que abstraiam os desafios da persistência com ORM em Java.

O problema é que cada um fazia isso de uma maneira diferente, o que se tornava um grande problema caso fosse necessário migrar para outra tecnologia. Imagine que você optou por um framework e poucos meses depois a empresa que mantinha esse framework deixou de existir. O que fazer? Basicamente, reescrever sua camada de acesso a dados com uma tecnologia nova.

Isso era ruim não apenas para arquitetos e programadores, mas também para o Java. Como optar por uma tecnologia que nos leva a um problema como esse? A JPA, então, foi criada, dando origem à especificação, e o Hibernate passou a implementá-la, como podemos entender melhor no seguinte curso:

Primeiros passos no Hibernate

Para o mercado, não basta saber utilizar a API JDBC para persistir dados com Java. Conhecer a API JPA e pelo menos um framework que a implemente é fundamental. A JPA abstrai e simplifica o acesso a dados, tornando transparente ao programador muitas preocupações que ele possui quando lida apenas com a JDBC, entre elas, o mapeamento objeto relacional. Observe a Figura 1.

Arquitetura de aplicação Java com JPA
Figura 1. Arquitetura de aplicação Java com JPA

Para introduzi-lo à Java Persistence API, reunimos o material a seguir:

Tão ou mais importante que conhecer a JPA é conhecer uma implementação da mesma, como o Hibernate. É com a implementação que, de fato, programamos o acesso a dados de nossa aplicação. E com o Hibernate, podemos, ainda, persistir dados utilizando ou não os recursos da especificação (Figura 2). Para ter o primeiro contato com ele, acesse:

Formulário de Resultado
Figura 2. Persistência de dados com Hibernate

Configurando o Hibernate

Agora que você já teve o primeiro contato com o Hibernate, vamos começar a nos aprofundar em seus recursos. Com o intuito de manter uma sequência lógica, aprenderemos primeiro como configurá-lo.

Quando o configuramos em um projeto, estamos definindo a versão do framework que será utilizada, o banco de dados, os dados para acesso ao banco, entre outras informações. Acesse os posts abaixo para aprender como especificar essas informações:

Mapeamento Objeto-Relacional

Com o Hibernate configurado, o próximo passo é realizar o mapeamento das classes às tabelas do banco de dados. Nas primeiras versões isso era feito via XML. Recentemente, com a implementação das annotations, passou a ser feito também via anotações, o que, em pouco tempo, se tornou a opção preferida dos programadores.

Mapeando entidades

No geral, toda classe que possui relação com uma tabela é chamada de entidade. Mas, como fazemos esse mapeamento em Java, como estabelecemos a ligação entre uma classe e uma tabela (Figura 3)? Para saber como fazer isso, acesse os conteúdos a seguir. Vale ressaltar que esse é um dos pontos mais importantes para a persistência, portanto, saber como fazê-lo é fundamental.

Mapeamento Objeto-Relacional
Figura 3. Mapeamento Objeto-Relacional

Para que você conheça alguns problemas que podem ser evitados ao realizar o mapeamento objeto-relacional, preparamos o seguinte conteúdo:

Mapeando relacionamentos

Com as entidades configuradas, as tabelas e colunas definidas, é fundamental também saber como mapear os relacionamentos entre elas. Como declarar em uma classe que um atributo representa a chave estrangeira de uma tabela, como declarar um relacionamento um para um, um para muitos? É sobre esses e outros assuntos que vamos explorar nos posts abaixo:

Outros recursos básicos

Para o correto uso do framework ORM é necessário conhecer outros recursos do mesmo. Nesta seção reunimos alguns deles, como é o caso da Session, interface fundamental do Hibernate para o acesso e persistência de dados.

Para aprender sobre ela, acesse:

Também é recomendado aprender sobre recursos como cascade e lazy e eager loading. As diferentes opções de cascade permitem ao programador definir a melhor forma como um conjunto de dados relacionados (envolvendo pelo menos duas entidades) deve ser salvo, atualizado ou removido.

Quando lidamos com listagens muito grandes, por exemplo, é uma boa prática considerar a melhor maneira como esses dados devem ser recuperados do banco de dados. Com as opções lazy e eager especificamos se todos os dados devem ser obtidos de uma vez ou conforme a demanda do usuário. Esse assunto é explorado nos posts:

Além desses, também preparamos mais alguns conteúdos para que você compreenda o funcionamento do framework e, a partir disso, saiba como melhor explorar seus recursos.

Consultas no Hibernate

Outra importante tarefa que precisamos tratar quando o assunto é persistência de dados é a forma como os dados são consultados. O Hibernate, em conjunto com a JPA, oferece várias opções para isso, do mais baixo ao mais alto nível de abstração.

Os cursos, devcasts e artigos abaixo ensinam como utilizar as principais ferramentas de consulta definidas pela JPA, assim como a soluções criadas pelo framework analisado nesse guia:

JPA

Uma das primeiras opções quando o assunto é consulta a dados é a Java Persistence Query Language, ou JPQL, a qual é introduzida no seguinte vídeo:

Hibernate

No Hibernate, a JPQL foi implementada e renomeada para HQL. Para aprender sobre ela, preparamos os posts abaixo:

Outra solução criada na JPA e implementada pelo Hibernate é a Criteria API. Com essa API podemos criar consultas de forma programática e orientada a objetos, isto mesmo, nós criamos as consultas chamando métodos encadeados. Para conhecê-la, acesse:

Caso você tenha interesse em ter uma visão geral sobre todas essas opções, assim como criar consultas no Hibernate utilizando código SQL (sim, isso é possível, e recomendado algumas vezes), confira os seguintes posts:

Por fim, recentemente, dada a importância que as consultas e o acesso a dados ganharam nessa nova era da informação, o Hibernate criou mais um mecanismo para tal, muito mais robusto e maduro para as necessidade do mercado: o Hibernate Search. Nos posts abaixo exploramos esse assunto:

Na prática

O próximo passo é pôr as mãos na massa com o framework. Com o intuito de auxiliá-lo nesta etapa, o material publicado nos links a seguir pode ser consumido. Você aprenderá como utilizar todos os recursos vistos até aqui e ao final terá não apenas classes mapeadas, mas também CRUDs completos e tudo aquilo que você precisa para criar a camada de acesso a dados.

Lembre-se que ao programar com Hibernate muitas classes e interfaces da JPA estão incluídas. Por isso, em muitos posts você encontrará referências a ambos (especificação e implementação).

Lembre-se também que o desenvolvimento de uma aplicação não se limita à camada de acesso a dados. Deste modo, é comum integrarmos o Hibernate/JPA a outras tecnologias, como exposto nos conteúdos a seguir:

Jersey/Web services

JSF/PrimeFaces

Spring

Validação de dados

Antes de persistir um dado é muito importante validá-lo. Por mais simples que seja um formulário, por exemplo, é comum que usuários preencham algum campo de forma incorreta. A validação possibilita um controle a essa entrada de dados e, com isso, evita problemas caso o dado precise ser processado ou mesmo exibido em um relatório.

Sobre esse assunto muitos programadores se perguntam: O que é melhor? Validar no back-end ou no front-end? Para abordar esse assunto gravamos os seguintes DevCasts:

Nesse contexto o Hibernate disponibiliza o Hibernate Validator, implementação de referência da especificação Bean Validation. Com Bean Validation a análise dos dados é feita nas classes de domínio, e com isso deixa de ser necessário validar dados no back-end e no front-end.

Para aprender sobre o Hibernate Validator, acesse:

Cache

Em algum momento pode ser que a sua aplicação comece a apresentar perda de performance. Um dos motivos para isso pode ser o acesso ao banco de dados. Para contornar situações como essa, uma opção é utilizar Cache, isto é, um mecanismo que mantenha os dados mais acessados, por exemplo, mais próximos da aplicação, de forma a reduzir o acesso ao banco e todo o tempo e recursos gastos com isso (Figura 4).

Cache de dados com Hibernate
Figura 4. Cache de dados com Hibernate

Os posts a seguir apresentam tudo o que você precisa para implementar cache com Hibernate:

Auditoria

O Hibernate também oferece uma solução completa para auditoria de dados, o Hibernate Envers. Com essa solução a auditoria pode ser feita dentro da aplicação e não mais no banco de dados, provendo assim uma maneira menos dependente do banco para observar como os dados e funcionalidades da aplicação estão sendo acessados e manipulados, se está ocorrendo acesso indevido, entre outras possibilidades (Figura 5).

Auditoria de dados com Hibernate Envers
Figura 5. Auditoria de dados com Hibernate Envers

Os posts abaixo apresentam o projeto Envers na teoria e na prática:

Documentação

Como material de referência sobre os recursos do Hibernate, preparamos as documentações a seguir. Utilize-as para consulta rápida:

Conteúdo Extra

Quando estiver programando com o Hibernate, é comum que você se depare com outros detalhes. Neste tópico separamos um conteúdo adicional que pode servir de apoio nessas ocasiões, por exemplo:

Algo comum e que pode gerar problemas ao software devido à quantidade de opções/formatos são as datas. Para auxiliá-lo na manipulação de datas em seus sistemas, preparamos os posts:

Caso você esteja em dúvida e precisa decidir entre um banco de dados relacional e um não relacional (NoSQL), os posts abaixo abordam os pontos que você deve considerar, tratando também da solução não relacional do Hibernate:

Por fim, vale ressaltar que o Hibernate também oferece opções para quem está planejando migrar seus dados para a nuvem. Para se aprofundar neste assunto, confira os posts abaixo:

Como você pôde verificar, o Hibernate é muito mais que um framework ORM. Ele é um projeto que, além de implementar a JPA, fornece um maduro e robusto conjunto de tecnologias que viabilizam um controle completo sobre os dados da sua aplicação.

Saiba mais: JDBC

JDBC é a API base para acesso a dados em Java. É com ela que o programador Java começará a escrever seus primeiros comandos SQL, bem como acessar diferentes bancos de dados, sem precisar de uma API específica para cada um deles. Sendo assim, mesmo quando utilizamos um framework de alto nível, a JDBC está presente.

Para saber mais sobre a JDBC, acesse:

Mais sobre Java

Além dos cursos e exemplos sugeridos nesse guia, a DevMedia publica com frequência novos conteúdos sobre Java, os quais você pode conferir nos Guias de Consulta abaixo:

Além disso, você pode conferir todo o conteúdo de Java clicando aqui.

Ficou com alguma dúvida?