Вы находитесь на странице: 1из 10

Hibernate

O Hibernate um framework para o mapeamento objeto-relacional escrito na linguagem Java, mas tambm disponvel 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 aplicao, mediante o uso de arquivos (XML) para estabelecer esta relao. Hibernate um software livre de cdigo aberto distribudo com a licena LGPL.

Caractersticas
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 atualizaes dos dados. Sua principal caracterstica a transformao 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 converso dos dados resultante, mantendo o programa portvel para quaisquer bancos de dados SQL, porm causando um pequeno aumento no tempo de execuo. Nas questes relacionadas para o gerenciamento de transaes e na tecnologia de acesso base de dados so de responsabilidade de outros elementos na infraestrutura do programa. Apesar de existirem API no Hibernate para possuir operaes de controle transacional, ele simplesmente delegar estas funes para a infraestrutura na qual foi instalada. No caso de aplicaes construdas para serem executadas em servidores de aplicao, o gerenciamento das transaes realizado segundo o padro JTA. J nas aplicaes standalone, o programa delega o tratamento transacional ao driver JDBC. Hibernate pode ser utilizado em aplicaes Java standalone ou em aplicaes Java EE, utilizando servlet ou sesses EJB beans.

Histria
Hibernate foi criado por desenvolvedores Java, espalhados ao redor do mundo, e liderado por Gavin King. Posteriormente, JBoss Inc (empresa comprada pela Red Hat) contratou os principais desenvolvedores do programa para fazer o seu suporte. A atual verso do Hibernate a 3.x, que incorporou caractersticas como a nova arquitetura Interceptor/Callback, filtros definidos pelo usurio e anotaes JDK 5.0 (Metadados do Java), que substitui os arquivos XML. Hibernate 3 tambm se aproxima das especificaes EJB 3.0 e atua como a espinha dorsal das implementaes EJB 3.0 em JBoss.

HQL
A HQL (Hibernate Query Language) um dialeto SQL para o Hibernate. Ela uma poderosa linguagem de consulta que se parece muito com a SQL, mas a HQL totalmente orientada a objeto, incluindo os paradigmas de herana, polimorfismo e encapsulamento. No Hibernate, voc pode escolher tanto usar a SQL quanto a HQL. Escolhendo a HQL, voc poder executar os pedidos SQL sobre as classes de persistncia do Java ao invs de tabelas no banco de dados, aumentando, assim, a distncia entre o desenvolvimento da regras de negcio e o banco de dados.

Persistncia usando Hibernate


Introduo

Hibernate um Framewok para mapeamento Objeto/Relacional em Java Possibilita desenvolver classes persistentes usando Java convencional: o Associao o Composio o Herana o Polimorfismo o e colees Java Implementa mecanismos de mapeamento: o Classes Java <-> Tabelas em SGBDs relacionais o Tipos Java <->Tipos SQL Implementa mecanismos convenientes para consulta e recuperao de dados Hibernate objetiva reduzir em cerca de 95% do tempo de desenvolvimento de tarefas relacionadas persistncia!

Viso Geral

A figura abaixo uma descrio de alto nvel da arquitetura do Hibernate

O Hibernate persiste objetos java comuns (POJO) Usa reflexo para acessar as propriedades persistentes de um objeto As classes persistentes so definidades (descritas) em documentos de mapeamento o Arquivos XML so usados para descrever os campos, associaes e subclasses persistentes

o o

Os Mapeamentos so "compilados" na inicializao da aplicao Podem ser usados tambm para operaes de suporte como: Gerao de esquemas do banco de dados Gerao de cdigo-fonte Java

Cdigo tpico no uso do Hibernate:


... SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction();

Cliente cliente = new Cliente(); cliente.setNome("Maria"); cliente.setEndereco("Endereo de Maria"); cliente.setEmail("maria@xpto.com");

session.save(cliente); tx.commit(); session.close(); ...

O cdigo destacado est relacionado operao do Hibernate o O primeiro passo da aplicao obter uma Session Esta a principal interface entre a aplicao e o Hibernate A SessionFactory permite a aplicao criar sesses a partir de arquivos de configurao hibernate.cfg.xml o Aps definir questes transacionais (opcional) a aplicao pode usar objetos persistentes e a sesso hibernate para salvar dados no SGBD.

Iniciando uso do Hibernate


O Hibernate funciona bem com o modelo POJO O uso de tipos de propriedades no restrito o permitido qualquer tipo Java (incluindo colees) o possvel mapear valores, colees de valores e associaes com outros objetos A classe persistente no precisa implementar/herdar qualquer classe especial do framework

Exemplo:
import java.io.Serializable; import java.util.Date; public class Cliente implements Serializable { private private private private private Long id; String nome; String endereco; String email; Date nascimento;

public Cliente(){ } public void setId(Long id){ this.id = id; } public Long getId(){ return id; } public void setNome(String nome){ this.nome = nome; } public String getNome(){ return nome; } ... public void setNascimento(Date nascimento){ this.nascimento = nascimento; } public Date getNascimento(){ return nascimento; } }

A classe Cliente precisa de um mapeamento para se tornar persistente

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping>

<class name="Cliente" table="CLIENTE"> <id column="CLIENTE_ID" name="id" type="java.lang.Long"> <generator class="sequence"/> </id> <property column="NOME" length="50" name="nome" not-null="true" type="java.lang.String" /> ... <property column="DATRA_NASCIMENTO" name="nascimento" type="java.util.Date" /> </class> </hibernate-mapping>

Os documentos de mapeamento podem ser gerados automaticamente a partir da base de dados ou das classes java O elemento <class> mapeia uma classe a uma tabela O elemento <id> um atributo da classe chave-primria da tabela O elemento <property> mapeia os demais atributos do objeto s colunas da tabela Por fim, necessrio criar o arquivo de configurao do hibernate:

<!DOCTYPE hibernate-configuration PUBLIC" -//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</pro perty>

<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</prop erty> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/exemplo</p roperty> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">r00Tp@$wd</property> <mapping-resource="Cliente.hbm.xml"/> </session-factory> </hibernate-configuration>

O arquivo de configurao prov informaes ao framework para conectar-se ao banco de dados O elemento <mapping-resource> aponta para o arquivo de mapeamento

Mais sobre mapeamento:


Mapeamento de Associaes

Para mapear relaes entre objetos persistentes usa-se os elementos <many-toone> e <one-to-one> o Mapeamento muitos-para-um com Cliente -> Dependentes

<many-to-one name="cliente" column="CLIENTE_ID" class="Cliente" not-null="true"/> o

Mapeamento um-para-um com Cliente -> Usurio

<one-to-one name="usuario" class="Usuario"/>

Mapeamento de Colees

Hibernate persiste as seguintes colees o java.util.Map o java.util.Set o java.util.SortedMap o java.util.SortedSet o java.util.List o e qualquer Array de objetos (ou valores) persistentes Propriedades do tipo java.util.Collection e java.util.List podem ser persistidos como "bag" Colees so mapeadas usando os elementos <set>, <list>, <map>, <bag>, <array> e <primitive-array> Uma tabela para a coleo requerida quando ela contem valores ou referencias para outras entidades mapeadas em muitos-para-muitos o Segue um exemplo de mapeamento para uma coleo de String

<set name="enderecos" table="ENDERECOS"> <key column="CLIENTE_ID"/> <element column="endereco" type="string"/> </set> o O elemento <key> indica a chave estrangeira na tabela ENDERECOS Para relacionamentos um-para-muitos as tabelas das classes so ligadas diretamente (sem uso de tableas intermedirias) o Exemplo:

<set name="dependentes" inverse="true"> <key column="CLIENTE_ID"/> <one-to-many class="Dependente" /> </set>

o o

Este o mapeamento da coleo de dependentes de um Cliente o atributo inverse indica que Dependente tambm referencia Cliente

<many-to-one name="cliente" column="CLIENTE_ID" class="Cliente" not-null="true" /> o Em dependente declarada a existncia da relao. Outras questes importantes: o Lazy Initialization o Relacionamentos ternrios

Mapeamento de Herana

O Hibernate suporta trs estratgias de mapeamento de herana o Uma tabela por hierarquia de classes o Uma tabela por subclasse o Uma tabela por classe concreta (polimorfismo implcito) No possvel misturar as estratgias para um mesmo mapeamento de classe Suponha que tenhamos a classe Pessoa e as subclasses Cliente, Fornecedor e Funcionario

<class name="Pessoa" table="PESSOA"> <id name="id" type="long" column="PESSOA_ID"> <generator class="native"/> </id> <discriminator column="TIPO_PESSOA" type="string"/> <property name="nome" column="NOME"/> ... <subclass name="Cliente" discriminator-value="CLT"> ... </subclass> <subclass name="Funcionario" discriminator-value="FCN"> ... </subclass> <subclass name="Fornecedor" discriminator-value="FRC"> ...

</subclass> </class>

No cdigo acima temos a estratgia de uma tabela por hierarquia Apenas uma tabela necessria, com todos os atributos da classe e suas subclasses A coluna <discriminator> indicar qual classe uma tupla representa A grande limitao que colunas das subclasses no podem ser declaradas NOT-NULL

<class name="Pessoa" table="PESSOA"> <id name="id" type="long" column="PESSOA_ID"> <generator class="native"/> </id> <property name="nome" column="NOME"/> ... <joined-subclass name="Cliente" table="CLIENTE"> <key column="PESSOA_ID"/> ... </joined-subclass> <joined-subclass name="Funcionario" table="FUCNIONARIO"> <key column="PESSOA_ID"/> ... </joined-subclass> <joined-subclass name="Fornecedor" table="FORNECEDOR"> <key column="PESSOA_ID"/> ... </joined-subclass> </class>

No cdigo acima temos a estratgia de uma tabela por subclasse Quatro tabelas sero usadas, uma para a superclasse e trs para as subclasses As tabelas das subclasses esto ligadas da superclasses via chave-estrangeira Melhor estratgia do ponto de vista relacional

<class name="Cliente" table="CLIENTE"> <id name="id" type="long" column="CLIENTE_ID"> <generator class="native"/> </id> <property name="nome" column="NOME"/> ... </class> <class name="Funcionario" table="FUNCIONARIO"> <id name="id" type="long" column="FUNCIONARIO_ID"> <generator class="native"/> </id> <property name="nome" column="NOME"/> ... </class> <class name="Fornecedor" table="FORNECEDOR"> <id name="id" type="long" column="FORNECEDOR_ID"> <generator class="native"/> </id> <property name="nome" column="NOME"/> ... </class>

No cdigo acima temos a estratgia de uma tabela por classe concreta

Note que a superclasse Pessoa no foi explicitamente mencionada Usa trs tabelas, cada uma replicando os atributos de pessoa Para indicar o polimorfismo usa-se o elemento <any>

<any name="pessoa" meta-type="class" id-type="long"> <column name="PESSOA_CLASS"/> <column name="PESSOA_ID"/> </any>

Consultas

As consultas usando Hibernate podem ser feitas de trs formas o Usando HQL (Hibernate Query Language) o Usando Criteria Queries o Usando SQL Nativo

Consultas HQL

O HQL uma linguagem SQL like, porm, "orientada a objetos" Possibilita descrever consultas polimrficas Possibilita consultas sobre colees

from Pessoa pessoa where upper(pessoa.nome) like 'MARIA%'

A consulta acima retorna todos os objetos da classe pessoa e de suas subclasses que tenham o nome comeado por MARIA Possibilita descrever consultas polimrficas Possibilita consultas sobre colees

Query q = session.createQuery("from Pessoa pessoa where upper(pessoa.nome) like :NOME"); q.setProperties(nome); List pessoas = q.list();

Criteria Queries

uma API (bastante intuitiva) extendvel para executar consultas Para execut-la, basta criar um objeto Criteria e definir nele os critrios da consulta

Criteria consulta = sess.createCriteria(Pessoa.class); consulta.add( Expression.like("nome", "Maria%") ); consulta.add( Expression.between("idade", 18, 40) ); List resultado = consulta.list();

A consulta acima vai retornar todas as Marias com idade entre 18 e 40 anos

Consideraes

O Hibernate um framework consolidado para fazer persistncia

Separa bem as coisas (o mundo OR do mundo OO) O overhead extremamente satisfatrio mantido por uma comunidade muito ativa O maior esforo para us-lo est na construo e manuteno dos mapeamentos Existem muitas ferramentas de apoio ao desenvolvimento usando Hibernate o XDoclets o Plugins para o Eclipse o Uso adequado destas ferramentas deixa apenas o trabalho estritamente necessrio para o desenvolvedor
o o o

Recursos

Pgina Principal: http://www.hibernate.org Documentao Oficial (em ingls): http://www.hibernate.org/hib_docs/reference/en/html/ Mapeamentos: http://www.j2eebrasil.com.br/jsp/tutoriais/tutorial.jsp?idTutorial=003_007 Colees: http://www.j2eebrasil.com.br/jsp/tutoriais/tutorial.jsp?idTutorial=003_006 IDs: http://www.allapplabs.com/hibernate/hibernate_o_r_mapping_generator_elemen t.htm Apostila bacana: http://www.guj.com.br/content/articles/hibernate/intruducao_hibernate3_guj.pdf POJO: http://en.wikipedia.org/wiki/Plain_Old_Java_Object

Вам также может понравиться