O processo de mapear objetos Java para tabelas em Banco de Dados e vice-versa é chamado de "Object-Relational Mapping" (ORM) ou Mapeamento Objeto-Relacional.
A JPA é uma das possibilidades para o Mapeamento Objeto-Relacional. JPA é uma especificação e atualmente várias implementações estão disponíveis, entre elas Hibernate, EclipseLink e Apache OpenJPA.
JPA também permite ao desenvolvedor mapear, armazenar, atualizar e recuperar informações de uma base de dados relacional para objetos Java e o contrário também é permitido.
Na especificação da JPA também temos a definição de alguns conceitos importantes como: Entidades que são os mapeamentos das tabelas do Banco de Dados, Atributos que equivalem as colunas do Banco de Dados, Relacionamentos entre entidades através de anotações como @OneToOne, @OneToMany, @ManyToOne, @ManyToMany, EntityManager que é responsável por prover operações do Banco de dados e também para o Banco de Dados, encontrar objetos, persisti-los, remove-los, etc, e por fim temos também a Unidade de Persistência (Persistence Units) que define as propriedades de conexão com o banco de dados.
Hibernate
O Hibernate é uma solução de persistência para Java poderosa e limpa, principalmente quando comparada com outras soluções de persistência. A integração do Hibernate com uma aplicação Java é bastante fácil, e na prática apenas é necessário termos um container J2EE (versão 5.0 para Hibernate 3.5).
Olhando à primeira vista a distribuição do Hibernate possui diversas bibliotecas. Mas para começarmos a desenvolver com Hibernate precisamos configurar o banco de dados, arquivos de mapeamento ou anotações, arquivos de configurações e objetos POJOs da nossa aplicação.
O Hibernate pode ser usado por uma aplicação Java diretamente, ou podemos acessar Hibernate através de outro framework. Podemos chamar o Hibernate através de uma aplicação Swing, Servlet, Portlet, JPS ou qualquer outra aplicação Java que tenha acesso a uma Base de Dados. Tipicamente usamos Hibernate ou para criar uma camada de acesso a dados ou para sobrepor uma camada de acesso a dados. Hibernate suporte Java Management Extensions (JMX), J2EE Connector Architecture (JCA), e Java Naming and Directory Interface (JNDI). Com JMX podemos configurar o Hibernate enquanto está rodando, Hibernate também pode ser publicado (deployed) como um JCA Connector e ainda usar JNDI para obter uma fábrica de sessão do Hibernate. Por fim, Hibernate usa drivers Java Database Connectivity (JDBC) para acessar base de dados relacionais. Vale ressaltar que Hibernate não sobrepõem JDBC como uma camda de conectividade de base de dados e sim situa-se um nivel acima do JDBC.
Publicando o Hibernate
Para integrarmos a nossa aplicação com Hibernate necessitamos usar várias bibliotecas Java. A primeira delas é o arquivo jar para o JDBC, devemos procurar uma que seja especifica para o nosso banco de dados relacional. Por exemplo, o postgre possui um jar JDBC específico, o Oracle possui outro e assim por diante. Cada Banco de dados possui seu próprio JAR exclusivo. O Hibernate não inclui qualquer driver JDBC, por isso necessitamos obter esse JAR como um download separado, provavelmente encontrado diretamente no site do fabricante.
Após conseguirmos esse JAR específico da nossa base de dados basta colocarmos junto com o arquivo hibernate3.jar na nossa aplicação. Essa biblioteca possui os pacotes org.hibernate que necessitamos e também vários DTDs e arquivos XML.
Bibliotecas Necessárias
O Hibernate requer várias bibliotecas além do hibernate3.jar. Essas bibliotecas estão incluídas no diretório lib/required da instalação do Hibernate 3.5. Além das bibliotecas encontradas em lib/required, o Hibernate também usa a biblioteca JPA, na qual está incluída no diretório lib/jpa.
O Hibernate também requer uma biblioteca de bytecode para funções. Existem duas bibliotecas bytecode com a distribuição do Hibernate - javassist e CGLib. Com o Hibernate 3.5, necessitamos usar um ou o outro. Para o nosso exemplo usaremos o javassist, que inclusive é a default.
Existem várias bibliotecas opcionais incluídas no Hibernate 3.5. Se construirmos o Hibernate a partir do código, algumas dessas são necessárias para o Hibernate compilar. Outras bibliotecas provém pools de conexões, funcionalidades de cache, e API JCA.
Configurações do Hibernate
O Hibernate também requer um conjunto de configurações que são frequentemente colocadas num arquivo de propriedades chamado hibernate.properties ou como um arquivo XML chamado hibernate.cfg.xml. Recomenda-se a utilização do arquivo em formato XML. Esses arquivos são colocados no diretório raiz da nossa aplicação.
Segue abaixo um exemplo de um arquivo hibernate.properties:
Listagem 1: Exemplo de arquivo de propriedades do Hibernate.
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost:5432/BancoExemplo
hibernate.connection.username = admin
hibernate.connection.password = password
hibernate.dialect = org.hibernate.dialect.HSQLDialect
hibernate.show_sql = true
E na listagem abaixo segue o exemplo de um arquivo hibernate.cfg.xml:
Listagem 2: Exemplo de arquivo XML do Hibernate.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/BancoExemplo</property>
<property name="hibernate.connection.username">admin</property>
<property name="connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">true</property>
<mapping class="com.exemplo.ed.Mensagem"/>
</session-factory>
</hibernate-configuration>
Essas são apenas algumas das propriedades que o Hibernate nos permite configurar, existem muitas outras propriedades. Algumas propriedades estão listadas na tabela abaixo. Vale ressaltar que apesar do Hibernate possuir diversas propriedades para que possamos configurar, só utilizaremos efetivamente algumas delas. O mais importante é dizer ao Hibernate como se conectar com um Banco de Dados e o tipo dele, muitas outras propriedades já possuem um valor default.
Nome da Propriedade | Descrição |
hibernate.c3p0.acquire_increment | O pool de conexão C3P0 aumenta a performance das aplicações com Hibernate gerenciando conexões da base de dados. Ao invés de se conectar com a base de dados a todo momento uma conexão é solicitada de cada vez, o pool de conexões mantém uma coleção de conexões abertas com a base de dados para a aplicação usar. Existem diversas propriedades de configuração C3P0 para o Hibernate. Após o pool de conexões estar completamente utilizado, determinamos quantas conexões podem ser adicionadas ao pool. |
hibernate.c3p0.max_size | Determina o tamanho máximo de conexões com o pool para o C3P0. |
hibernate.c3p0.max_statements | Determina o limite máximo de cache de comandos SQL para o C3P0. |
hibernate.c3p0.timeout | Determina o timeout em segundos para o C3P0. |
hibernate.connection.autocommit | Permite o modo autocommit para ser usado nas conexões JDBC. |
hibernate.connection.datasource | O nome do datasource utilizado pelo container. |
hibernate.connection.driver_class | A classe do diver JDBC. |
hibernate.connection.password | Define a senha da Base de Dados. |
hibernate.connection.pool_size | Limita o número de conexões aguardando no pool de conexão da base de dados do Hibernate. |
hibernate.connection.url | URL (JBDC) da instancia da base de dados. |
hibernate.connection.username | Username da Base de Dados. |
hibernate.hbm2ddl.auto | Automaticamente cria, atualiza ou deleta o esquema da base de dados na inicialização e no desligamento da base de dados. Os três valores possíveis são: create, create-drop e update. |
hibernate.use_identifier_rollback | Determina onde o Hibernate usa identificador de rollback. |
hibernate.use_sql_comments | Gera SQL com comentários. |
Tabela 1: Algumas propriedades de configuração do Hibernate.
Devemos atentar para a propriedade hibernate.connection.autocommit que normalmente não é uma boa pratica a sua utilização, o ideal é não utilizá-lo. Também devemos cuidar a utilização da propriedade hibernate.hbm2ddl.auto quando utilizamos "create-drop".
Conclusão
Neste artigo vimos o que é JPA e como ele se relaciona com o Hibernate. Estudamos as principais características do Hibernate e como podemos facilmente configurar uma aplicação com Hibernate. Também vimos os seus principais arquivos de configurações e propriedades.
Bibliografia
- Jeff Linwood and Dave Minter. An introduction to persistence using Hibernate 3.5, Second Edition. Apress.
- Steve Perkins. Hibernate Search by Example: Explore the Hibernate Search system and use its extraordinary search features in your own applications. Packt Publishing.