Você está na página 1de 15

Camada de Persistncia de Dados para Aplicaes Java: O Hibernate

Gabriel Rocha, Hildebrando Filho, Rutemberg Jurity Instituto de Matemtica Universidade Federal da Bahia (UFBA)
rocha.gabriel@gmail.com, hildebahia31@gmail.com, bergjurity@gmail.com

Abstract: This is a work of MAT A60'S discipline, Banco de Dados, administered by teacher Daniela Barreiro Claro, that it seeks to present in a brief and objective way the layer of persistence of data of applications Java, Hibernate. An abbreviation historical of Hibernate, Hibernate-3, is approached his interface with XML, a simple example of application, the relationship between the layers of Hibernate and a fast vision of his manipulation language and recovery of data, the HQL Hibernate Query Language. Resumo: Este um trabalho da disciplina de MAT A60, Banco de Dados, administrada pela professora Daniela Barreiro Claro, que visa apresentar de forma sucinta e objetiva a camada de persistncia de dados de aplicaes Java, o Hibernate. Aborda-se um breve histrico do Hibernate, o Hibernate-3, sua interface com o XML, um exemplo simples de aplicao, o relacionamento entre as camadas do Hibernate e uma viso rpida da sua linguagem de manipulao e recuperao de dados, o HQL Hibernate Query Language.

INTRODUO

A maior parte das mais notveis aplicaes comerciais computacionais requer persistncia de informaes. Persistncia um conceito fundamental que deve ser discutida e encarada com seriedade desde o incio da modelagem do projeto. Muitas vezes, a forma como dever ser feita a preservao dos dados determinante e controlar muita das prximas etapas de confeco do sistema. As aplicaes que no exigem que os dados sejam preservados so pequenas aplicaes de uso restrito que no implementam funcionalidades importantes ou complexas. Dessa forma, quanto mais complexa for uma aplicao mais dever ter uma camada de persistncia grande e desenvolvida, ou seja, h uma relao direta entre quantidade de informaes preservadas e a complexidade inerente ao sistema. A maior parte do contedo deste artigo destina-se a exemplificar e explicar o porqu de solues como Hibernate serem necessrias e quais so os grandes obstculos que devem ser contornados quando se pretende guardar e gerenciar informaes diretamente em solues SGBDs bastantes conhecidas e difundidas atualmente.

O modelo relacional representa toda e qualquer informao em tabelas de dados de duas dimenses. Essa a forma como os desenvolvedores observam e trabalham com as informaes que devem ser preservadas. Tabelas podem relacionar-se umas em relao s outras atravs de chaves estrangeiras e chaves primrias identificam unicamente uma linha nessa tabela. Entretanto, os desenvolvedores modelam seus sistemas utilizando objetos e produzem aplicaes orientadas a objetos, modelando as informaes. Dessa maneira consegue-se entender e dominar o problema naturalmente e mais prximo a realidade humana. O problema chave reside na incapacidade de todos os SGBDs conhecidos em no preservarem objetos diretamente. Ao invs disso os objetos devem ser primariamente representados em tabelas de dados, perdendo-se assim a maioria das caractersticas importantes que um sistema orientado a objetos deva possuir, at mesmo no momento que a informao precisa ser salva.

ARQUITETURA BASEADA EM CAMADAS


Uma tpica arquitetura dos sistemas orientados a objetos compreende grupos de classes que podem ser divididas e visualizadas em camadas. uma excelente forma de organizar as classes que compes a aplicao como um todo com a finalidade principal de que para futuras modificaes em uma determinada camada no sejam necessrias grandes e dificultosas modificaes nas outras camadas da aplicao. Por fim, cada camada composta por classes que se relacionam a fim de desempenhar uma tarefa especfica e importante na aplicao. Os sistemas tpicos dessa arquitetura so divididos em 3 camadas (figura 1).

Figura 1: Uma exemplificao das camadas do Hibernate e o relacionamento entre elas.

Faz-se ento necessrio para futuros entendimentos uma breve explanao do papel desempenhado por cada camada da arquitetura: Camada de aplicao, camada de negcios e a camada de persistncia.

Camada de Apresentao: a camada de apresentao est no topo da arquitetura. responsvel, principalmente, por implementar a parte da aplicao na qual o usurio deve interagir. A saber, controle do fluxo de pginas e preenchimento de formulrios; Camada de Negcio: esta camada responsvel em implementar todo cdigo responsvel pela lgica de negcio. Boa parte da complexidade do sistema implementada e resolvida por esta camada; Camada de Persistncia: a camada de persistncia compreende o grupo de classes responsveis em persistir dados e informaes, como tambm, recuper-los de e gerenci-los de forma eficiente. Atualmente nas aplicaes comerciais de grande porte empregado um esforo cada vez maior na tentativa e preservar informaes em sistemas relacionais. A camada de persistncia lida diretamente com esses esforos e requerimentos. importante saber que grande parte dessa dificuldade talvez no seja necessria na medida em que apesar da camada de persistncia seja fundamental em um sistema tipicamente complexo, ela no implementa novas funcionalidades. O papel dessa camada simplesmente preservar informao. Todavia todo o esforo empregado para codificar classes na camada de negcio justificvel visto que esta camada implementa toda lgica de negcio e que por sua vez residem os principais e mais complexos problemas a serem modelados e resolvidos.

HIBERNATE

Histrico O Hibernate foi totalmente codificado e desenvolvido por desenvolvedores Java, espalhando-se ao redor do mundo, desenvolvedores estes liderados por Gavin King. Logo depois, A JBoss Inc (empresa adquirida pela Red Hat ) se aliou aos principais desenvolvedores do framework para fazer um suporte mais efetivo. A verso atual do Hibernate a 3.x que absorveu e incorporou caractersticas e especificaes inovadoras como a nova arquitetura Interceptor/Callback, filtros determinados pelo usurio e anotaes JDK 5.0 (Metadados da linguagem Java ), que faz substituio aos arquivos XML. Hibernate 3.x tambm prximo das especificaes EJB 3.0 e atua como uma espcie de coluna vertebral das implementaes EJB 3.0. Definio O Hibernate um tipo de framework para o mapeamento objeto-relacional totalmente desenvolvido na linguagem Java, mas tambm pode ser encontrado em .NET com o nome de NHibernate. Este programa visa facilitar o mapeamento dos atributos entre uma base de dados tradicional e o modelo orientado a objetos de uma aplicao, mediante o uso de arquivos (XML ) para estabelecer esta relao. Hibernate um software do tipo open-source, distribudo com a licena LGPL.

Caractersticas A funo do Hibernate minimizar a complexidade associada aos aplicativos Java, baseado no modelo orientado a objeto, que necessitam trabalhar com um banco de dados tradicional do modelo relacional (presente na maior parte dos SGBDs). Em especial, na codificao de consultas e atualizaes dos dados. Sua caracterstica mais importante a transformao das classes do Java para tabelas de dados (e dos tipos de dados Java para os da SQL). O Hibernate constri chamadas SQL e livra o desenvolvedor do tedioso trabalho manual da transformao dos dados resultantes, mantendo o programa praticamente portvel para quaisquer bancos de dados SQL, graas ao suporte de uma linguagem prpria e poderosa chamada Hibernate Query Language - HQL, que suporta e amplia o SQL nativo. Estas facilidades, todavia, cobram seu preo ao causar um pequeno custo no aumento do tempo de execuo. Mais adiante inclumos um captulo onde falaremos mais detidamente sobre o HQL. As questes atribudas para o gerenciamento de transaes e referentes a tecnologia de acesso base de dados so de responsabilidade de outros elementos na arquitetura funcional do programa. Apesar de existirem API no Hibernate para possuir operaes de controle transacional, ele simplesmente delegar estas funes para a infra-estrutura sobre a qual foi instalada. Em relao s aplicaes desenvolvidas para serem executadas em servidores de aplicao, o gerenciamento das transaes relacionais segue o padro JTA. J nas aplicaes standalone, o programa desvia o tratamento transacional para o driver JDBC. O Hibernate pode ser usado em aplicaes Java standalone ou em aplicativos Java EE, fazendo uso de servlets ou mesmo de sesses EJB beans.

ORM
ORM ou Mapeamento Objeto Relacional uma nova tcnica de desenvolvimento empregada para reduzir o custo associado programao orientada a objetos utilizando banco de dados relacionais. As tabelas de dados do banco so representadas atravs de classes e as linhas de cada tabela so representados como instncias das classes correspondentes. Com esta nova tcnica, o programador pode abstrair os detalhes de como construir as queries para pesquisar no SQL. Ele far uso de uma interface de programao simples que faz todo o restante do trabalho de persistncia. No preciso uma relao direta entre as tabelas de dados e as classes da aplicao. A relao entre as tabelas de onde originam os dados e os objetos que os disponibilizaro configurada pelo desenvolvedor, isolando o cdigo do programa das modificaes organizao dos dados nas tabelas do banco de dados. A maneira como este mapeamento configurado dependente da ferramenta que pode ser possvel utilizar. Como exemplo, o desenvolvedor que faz uso do

Hibernate na linguagem Java pode usar ficheiros XML ou o sistema de anotaes que a linguagem tem includa. No final deste artigo anexamos um exemplo prtico de mapeamento XML.

LINGUAGEM PARA MANIPULAO DOS DADOS PERSISTIDOS


Hibernate Query Language Assim como o Hibernate implementa uma forma de persistncia de dados orientada a objetos, natural que tambm apresente como necessidade que possa uma linguagem de manipulao de dados prpria para este paradigma. Neste cenrio o SQL demonstra-se insuficiente, sendo necessrio uma linguagem prpria para o Hibernate. E esta linguagem veio com a Hibernate Query Language, a HQL. A HQL uma linguagem que pretende ser mais fcil e poderosa que o SQL. Ela permite trabalhar com os mapeamentos da orientao a objetos do HQL, e ainda permite, por uma questo de compatibilidade retrograda com os databases j existentes, suporta o SQL nativo. Supostamente o SQL gerado pelo HQL j otimizado, e caso ocorra uma perda em consultas crticas deve-se otimizar o HQL, e no o SQL gerado. O HQL foi inspirado do SQL e por sua vez inspirou o EJB-QL, a linguagem de manipulao de dados do EJB 3. Eis o exemplo de quatro operaes bsicas do HQL: UPDATE: A operao update atualiza no banco de dados as alteraes feitas nos objetos. Para tanto, especifica-se a tabela e o objeto a ser atualizado. Por exemplo: UPDATE [VERSIONED] [FROM] path [[AS] alias ] [...] SET property=value [...] [WHERE expressologica]. DELETE: Assim como a operao de update, a operao delete apenas modifica os dados no banco de dados, no alterando os dados na memria. Usa a seguinte sintaxe: DELETE [FROM] [[AS] alias] [WHERE expressologica]. INSERT: Usada para inserir entidades. Mas diferentemente do SQL padro, no HQL insert s serve para inserir entidades resultantes de outras queries. Usa a seguinte sintaxe: INSERT [INTO path (property [...] ) SELECT. SELECT: Select a operao para busca e recuperao de dados inseridos no banco. Essa operao recupera objetos baseado em critrios de propriedades dos objetos (busca com restries). Ela usa a seguinte sintaxe: [SELECT [DINSTINCT] property [...]] FROM path [[AS] alias [...] [FETCH ALL PROPERTIES] WHERE expressologica. Para se fazer uma pesquisa no Hibernate, deve-se criar um objeto Query, objeto este definido no pacote org.hibernate.Session. Esse objeto recebe como parmetro uma string equivalente a query da pesquisa que se deseja fazer no banco de dados (os objetos

persistidos). Caso ocorra algum problema, lana-se uma exceo. Aqui a assinatura da criao de um objeto Query: public Query creatQuery(String query_string) throws HibernateException Uma vez criado um objeto Query, pode-se criar pesquisas para estes objetos a exemplo do que se faz no modelo relacional. Eis um exemplo de pesquisa: Query query=session.creatQuery(from Product); List results=query.list(); Um objeto tipo Query chamado query criado, passando-se para seu construtor uma string com a nossa consulta (no caso a consulta from Product, uma query tpica de SQL que retorna todos os elementos da tabela Product). Aqui cabe uma observao. O Hibernate no uma linguagem case-sensitivy, o que quer dizer que no distingue maisculas de minsculas nas pesquisas. As expresses from Product, FROM Product ou mesmo From Product, apesar de apresentarem diferenas quanto ao uso de maisculas e minsculas, sero tratadas igualmente pelo Hibernate. S faria diferena se mudasse o nome da classe Product alterando algumas de sua letras. Neste caso, com referncia a nomes de classes, o Hibernate case-sensitivy. O resultado da pesquisa um vetor de objetos que ser jogado em results. Aqui cabe outra observao: qualquer pesquisa no HQL sempre retornar um vetor, mesmo em casos que a resposta seja nica (conforme ser visto mais adiante). Estes objetos so acessados pelo mtodo list(). Na verdade o que o HQL faz pegar a string passada para o construtor da classe Query e converter para um SQL passvel de execuo. O administrador do sistema tem a opo de habilitar o direcionamento da sada da execuo para um arquivo de log, para posteriormente analisar o SQL gerado (caso por algum motivo seja necessrio sua anlise pelo DBA). O SQL gerado precedido no arquivo de log pela palavra Hibernate, inserida automaticamente no arquivo para indicar que aquele um SQL gerado automaticamente pelo HQL. Para facilitar a vida do usurio que posteriormente tente analisar o cdigo, o HQL permite a insero de comentrios no mesmo em um formato parecido com o formato dos comentrios de programas Java. Para tanto utiliza-se o mtodo setComment(String Comentrio) do objeto Query. Um exemplo: Query query=session.creatyQuery(from Product); query.setComment(My SQL); Este mtodo se inserido em um programa Hibernate gera a seguinte linha no SQL gerado: Hibernate: /*My SQL*/ aqui o resultado da consulta Vale ainda observar que mesmo um DBA experiente tem dificuldades de entender (pelo menos inicialmente) o cdigo gerado pelo HQL [Minter e Linwood, 2006]. No processo de traduo, o Hibernate introduz vrias linhas a mais tornando o cdigo um autntico pesadelo para usurios iniciantes. Por isso, o uso de comentrios e a habilitao do arquivo de log para a compreenso do que o sistema est fazendo so aes recomendadas e vlidas. As pesquisas HQL permitem o uso de alias. Isso aumenta em muito o poder de uma query, permitindo pesquisas mais complexas. Para indicar o uso de um alias,

devemos colocar o nome do objeto (no modelo relacional seria a entidade) seguido pela clusula AS e o novo nome do objeto, sendo que o uso da clusula AS opcional (porm fortemente recomendada, para facilitar compreenso de usurios que posteriormente analisem o cdigo). Por exemplo, as expresses abaixo so equivalentes: from Product as P equivalente a from Product P Este tipo de operao carrega todos os objetos tipo Product, sendo que de acordo com a aplicao, talvez apenas uma certa propriedade ou grupo de propriedades dos objetos sejam necessrios. Nestes casos, carregar todos os objetos representa um desperdcio de memria e de fluxo de rede. Uma soluo o usurio otimizar sua pesquisa, carregando apenas as propriedades necessrias na pesquisa (equivalente no modelo relacional as operaes de seleo e projeo). No exemplo abaixo o usurio est interessado apenas nos nomes dos objetos persistidos Product, dispensando todo o resto: Select P.nome from Product as P Isso carregar como resposta um vetor que contm apenas o atributo nome, do objeto tipo Product. Uma maneira do usurio customizar suas pesquisas se valendo de restries. Restries so condies impostas as queries para que retornem objetos ou atributos apenas quando obedecerem certas condies. Para tanto, utiliza-se de operadores auxiliares nas clusulas WHERE das pesquisas, como os mostrados a seguir: Operadores lgicos: OR< AND, NOT Operadores de igualdade: =, <> , !=, ^= Operadores de comparao: <, >, <=, >=, LIKE, NOT LIKE, BETWEEN, NOT BETWEEN Operadores matemticos: +, -, *, / Operador de concatenao; || Expresso CASE: CASE WHEN <expresso_logica> <expresso_unria> ELSE <expresso_unria> END Nomes de parmetros HQL: DATE, QUANTIFY Parmetro de pesquisa JDBC: ? Operadores de data e tempo do SQL-92: CURRENT_DATE(), CURRENT_TISTAMP(); CURRENT_TIME(), THEN

Funes SQL (se suportadas no banco de dados): UPPER(), LOWER(), LTRIM(), RTRIM()

Esses operadores tornam as pesquisas mais potentes. Um exemplo: from Product where price>25.0 and name like Hil% Essa pesquisa procura na tabela Product por objetos que contenham em seu atributo name uma certa string. No caso, seria qualquer string comeada por Hil. O operador % faz o papel de caractere curinga, permitindo qualquer combinao de caracteres em seu lugar.

Outra forma de se fazer pesquisas, esta forma mais dinmica, permitir que a restrio seja inserida durante a execuo. Para tanto a restrio entraria como uma string, o que permitiria um usurio malicioso inserir um comando simples, porm fatal, tipo delete from Products (o que apagaria toda a tabela de produtos. J pensou esse comando aplicado ao banco de dados de uma grande empresa, tipo submarino.com?). Uma forma de permitir restries dinmicas, sem incorrer nesta possibilidade, usar os chamados parmetros mencionados, como no exemplo abaixo: String hql=from Product where price>:price; Query query=session.createQuery(hql); query.setDouble(price,25,0); List results=query.list(); Dessa forma, a varivel price obrigatoriamente vinculada ao tipo double pelo mtodo setDouble(), impedindo um usurio malicioso inserir um comando tipo delete. Como j foi mencionado, o resultado de qualquer pesquisa no Hibernate sempre ser um vetor de objetos (como no exemplo acima, onde o vetor resultante acessado pelo mtodo list() da interface Query). Esse vetor de objetos sempre do mesmo tipo, e so indexados por nmeros inteiros, comeando por 0. Essa indexao chama-se de paginao. Para se navegar pelos resultados, devem-se usar os ndices (permitindo um acesso direto ao objeto procurado). A interface Query permite dois mtodos prprios para facilitar a paginao: os mtodos setFirstResult() e o setMaxResults(). O mtodo setFirstResult() recebe um inteiro como parmetro, sendo este inteiro setado como a primeira linha do vetor resultante (ou a primeira tupla, se fizermos uma comparao com o modelo relacional). O mtodo setMaxResults() faz o inverso. Utiliza o inteiro recebido como parmetro como o ltimo ndice do vetor resultante (a ltima tupla). Um exemplo: query.setFirstResult(1); query.setMaxResults(2); Estas linhas de cdigo permitem que o vetor resultante da pesquisa comece no ndice 1 e termine no 2, ignorando os demais resultados (se houverem). Outro mtodo da interface Query importante o uniqueResult(), que recupera apenas um objeto. Caso o mtodo recupere dois ou mais objetos, lana-se uma exceo (NonUniqueResultException). Se s tiver um resultado, este lanado em um vetor na posio zero. Se no tiver nenhum resultado, retorna um null. Um exemplo simples: String hql=from Product where price>25.0; Query query=session.creatQuery(hql); query.setMaxResults(1); Product product=(Product) query.uniqueResult(); // aqui cabe um teste para o caso da resposta ser null O resultado da pesquisa com restrio na tabela Product (todos os produtos cujos preos so maiores que 25.0) so jogados no objeto query, e logo aps seta-se o

vetor resultante como ndice mximo 1. Depois cria-se um objeto product onde ser alojado o resultado do mtodo uniqueResult(), fazendo a coero para garantir que o objeto resultante ser do tipo Product. Caso houvesse dois objetos no vetor, lanar-se-ia a exceo. E como os resultados das queries so alojados em vetores, natural que se possa organizar os vetores segundo algum critrio. Essa a funo da clausura Order by, que funciona de forma anloga ao seu funcionamento no SQL. Um exemplo: from Product p order by p.supplier.name asc, p.price asc Essa query ordena os objetos do tipo Product segundo dois critrios: primeiro, em ordem alfabtica dos nomes dos produtos; segundo, por ordem de preo. Em ambos os casos a ordenao ascendente. Se o usurio quisesse que o vetor resultante fosse organizado em ordem decrescente, bastaria colocar a palavra desc no lugar de asc na query. O HQL suporta ainda os chamados mtodos agregados, equivalentes as funes agregadas do SQL. A nica diferena que no HQL os mtodos agregados so adaptados para a realidade dos objetos persistidos do Hibernate. Alguns exemplos de mtodos agregados: avg(property name): retorna um valor com o valor mdio da propriedade; count(property name ou *): retorna o nmero de ocorrncias do parmetro; max(property name): retorna o valor mximo da propriedade; min(property name): retorna o valor mnimo da propriedade; sum(property name): retorna um valor equivalente a soma de todos os valores da propriedade passada como parmetro;

Sendo que o uso da palavra-chave dinstict, a exemplo do que ocorre no SQL, permite a diferenciao das ocorrncias. O exemplo: select count(dinstict product.supplier.name) from Product product; Retorna um vetor com um nico resultado, que composto por um inteiro que contabiliza quantos nomes diferentes de fornecedores existem na tabela Product (uma vez que supplier uma classe que estende Product. No HQL as queries alcanam as classes filhas, atravs da herana). Estas queries de contagem, soma, mdia, etc., retornam um vetor de objetos tipo inteiro, composto por apenas um objeto (como foi dito, todas as pesquisas no HQL retornam sempre um vetor de objetos). Esse valor alcanado por um mtodo, como por exemplo o mtodo uniqueResult() j mencionado. Como as operaes realizadas em uma classe afetam atravs da herana seus descendentes, este uma forma interessante de aplicar um update ou delete massivo numa nica operao (chamada de bulk update e bulk delete). Ao se deletar por exemplo os objetos da classe Supplier (cuja superclasse Product), o usurio est afetando de uma vez todos os objetos persistidos do banco de dados da classe Supplier. Este recurso, se usado acompanhado de restries (where), torna-se um meio confivel e prtico de atualizar o banco de dados. Mas nem todos os bancos de dados previamente existentes o HQL seria aplicvel. Pode haver um banco de dados j construdo, impraticvel de ser reconstrudo

pelo seu gigantismo e que no suporta o HQL gerado pelo Hibernate. Para garantir compatibilidade retrgrada com este tipo de banco, o Hibernate juntamente com a interface Query (a estudada at agora), implementa outra interface, a interface SQLQuery (na verdade, a interface SQLQuery estende a interface Query). Os objetos criados a partir desta interface apresentam o mtodo createSQLQuery(), que gera o SQL puro suportado por estes bancos de dados que s trabalham com SQL nativo.

ESTUDO DE CASO:

Um exemplo simples: Hello world Aplicaes Hibernate definem classes persistentes que so mapeadas em tabelas de banco de dados. Este Hello World consiste em uma classe e um documento de mapeamento (ver Documento de Mapeamento). Vamos examinar como uma classe persistente deve parecer, como o mapeamento definido e mais algumas coisas que podemos fazer com instncias de classes persistentes usando Hibernate. O objetivo de nossa aplicao-exemplo armazenar mensagens num banco de dados e recuper-las para exibio. A aplicao possui uma simples classe persistente, Mensagem, que representa estas mensagens. Nossa classe mensagem mostrada abaixo: Package helloWorld. Public class Mensagem { Private long id; Private String texto; Private Mensagem proxMensagem; Private Mensagem(){} Public Mensagem(String texto) { This.text = text; } public Long id getId() { return id; } public void setId(Long id) { this.id = id; }

public string getTexto( ) { return texto; } public void setTexto(String texto) { this.texto = texto; } public Mensagem geProxMensagem() { return proxMensagem; } private void setProxMensagem(Mensagem proxMensagem) { this.proxMensagem = proxMensagem; } } A classe mensagem possui trs atributos: O atributo identificador(id), o texto da mensagem(texto), e a referencia para outra mensagem. O atributo identificador permite que a aplicao acesse valor da chave primria de um objeto persistente. Se duas instncias de mensagem tem o mesmo valor de identificador eles representam a mesma tupla na tabela do banco de dados. Instncias da classe mensagem podem ser feitas persistentes pelo Hibernate, mas no devem necessariamente ser. Desde que o objeto mensagem no implementa qualquer classes ou interfaces especficas do Hibernate, ns podemos us-lo como qualquer outra classe Java: Mensagem mensagem = new Mensagem(Hello World); System.out.println(mensagem.getTexto()); Este cdigo faz exatamente o que espera-se de aplicaes Hello World. Imprime no console a mensagem Hello World. Isto mostra tambm a diferena entre o Hibernate e outras solues de persistncia. As classes persistentes do Hibernate podem ser utilizadas em qualquer contexto, sem a necessidade de nenhum container especial. Vamos ver agora como o Hibernate salvar o objeto mensagem no banco de dados: Session sessao = getSessionFactory().openSession(); Transaction tr = sessao.beginTransaction(); Mensagem msg = new Mensagem(Hello World); sessao.save(msg);

Este cdigo chama as interfaces Session e Transaction. Esta chamada resulta em algo similar a seguinte sentena SQL: Insert into MENSAGEM (MENSAGEM_ID, MENSAGEM_TEXTO, PROX_MENSAGEM_ID) values (1, Hello World, null) Note que a propriedade id iniciada com um valor, mesmo no tendo sido atribudo nenhum anteriormente. Na verdade a propriedade id uma propriedade especial: ela uma propriedade identificadora. Ela recebe um valor nico gerado automaticamente. O valor atribudo a instncia de mensagem pelo Hibernate quando o mtodo SaveSave() chamado. O prximo exemplo recupera todas as mensagens armazenadas no banco de dados, e as imprime: Session novaSessao = getSessionFactory().openSession(); Transaction newTransaction = newSession.beginTransaction(); List mensagens = novaSessao.find("from Mensagem as m order by m.text asc"); System.out.println( mensagens.size() + " mensagem(s) encontrada:" ); for ( Iterator iter = mensagens.iterator(); iter.hasNext(); ) { Mensagem msg = (Mensagem) iter.next(); System.out.println( msg.getText() ); } newTransaction.commit(); novaSessao.close(); A string from Mensagem as m order by m.text asc uma consulta Hibernate expressa em sua prpria linguagem de consulta orientada a objetos (HQL). Esta consulta internamente traduzida para a seguinte SQL quando find() chamado: select m.MENSAGEM_ID, m.MENSAGEM_TEXTO, m,PROX_MENSAGEM_ID from MENSAGEM m order by m.MENSAGEM_TEXTO asc E que gera a sada: 1 mensagem(ns) encontrada(s): Hello World

Agora vamos modificar nossa primeira mensagem e criar uma nova associada a ela, como mostra o cdigo abaixo: Session sessao = getSessionFactory().openSession(); Transaction tx = sessao.beginTransaction(); // 1 o id gerado da primeira mensagem Mensagem msg =(Mensagem) sessao.load( Mensagem.class, new Long(1) ); msg.setText("Ol, tudo bem?"); Mensagem proxMensagem = new Mensagem("Sinta-se a vontade"); Mensagem.setProxMensagem( proxMensagem ); tx.commit(); sessao.close(); Este cdigo chama trs sentenas SQL dentro da mesma transao: select m.MENSAGEM_ID, m.MENSAGEM_TEXTO, m.PROX_MENSAGEM_ID from MENSAGEM m where m.MENSAGEM_ID = 1 insert into MENSAGEM (MENSAGEM_ID, PROX_MENSAGEM_ID) values (2, 'Sinta-se a vontade', null) update MENSAGEM set MENSAGEM_TEXTO = 'Ol, tudo bem?', PROX_MENSAGEM_ID = 2 where MENSAGEM_ID = 1 Note como o Hibernate detecta a modificao para as propriedades texto e proxMensaegm da primeira mensagem e automaticamente atualiza o banco. Esta caracterstica chamada automatic dirty checking: Ela nos poupa o esforo de comunicar ao Hibernate explicitamente para atualizar o banco de dados quando modificamos o estado de um objeto dentro de uma transao. Similarmente, podemos notar que as novas mensagens foram tornadas persistentes quando uma referncia foi criada na primeira mensagem. Esta caracterstica chamada de cascading save: Isto poupa-nos o esforo de explicitamente tornar o novo objeto persistente chamando save(), desde que, ele j alcanvel por um objeto j persistente. Note tambm que a ordem de execuo das sentenas SQL no a mesma na qual setamos os valores das propriedades. O Hibernate usa um sofisticado algoritmo para determinar uma ordenao eficiente que no viola a restrio de integridade de chave estrangeira e ainda assim suficientemente otimizada. Esta caracterstica chama-se transactional write-behind Se ns rodarmos novamente a aplicao, teremos: 2 mensagem(ns) encontrada(s): MENSAGEM_TEXTO,

Ol, tudo bem? Sinta-se a vontade Documento de mapeamento Para que esta mgica ocorra, o Hibernate necessita mais informaes sobre como a classe Mensagem deve se tornar persistente. Esta informao normalmente fornecida por um documento XML de mapeamento. Este documento define, entre outras coisas, como as propriedades da classe MENSAGEM sero mapeadas para as colunas da tabela MENSAGEM. Segue abaixo um exemplo de um documento de mapeamento: <?xml version="1.0"?> <!DOCTYPE Hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://Hibernate.sourceforge.net/Hibernate-mapping-2.0.dtd"> <Hibernate-mapping> <class name="helloWorld.Mensagem" table="MENSAGEM"> <id name="id" column="MENSAGEM_ID"> <generator class="increment"/> </id> <property name="texto" column="MENSAGEM_TEXTO"/> <many-to-one name="proxMensagem" cascade="all" column="PROX_MENSAGEM_ID"/> </class> </Hibernate-mapping> O documento de mapeamento diz ao Hibernate que a classe Mensagem deve ser persistida na tabela Mensagem, que a propriedade identificadora mapeada para a coluna chamada MENSAGEM_ID, a propriedade texto mapeada na coluna MENSAGEM_TEXTO e a propriedade proxMensagem uma associao de

multiplicidade muitos-para-um que mapeia na coluna PROX_MENSAGEM_ID. O arquivo XML tambm pode ser inserido dentro do cdigo por meio de comentrios. No importa o mtodo que voc escolha, O Hibernate ter informao suficiente para gerar todas as sentenas SQL que sero necessrias para inserir, atualizar, deletar e recuperar instncias da classe Mensagem. Voc no precisar mais escrever estas sentenas SQL explicitamente.

CONCLUSO:
O Hibernate surgiu como uma soluo definitiva para toda um a gerao de programadores Java. Ele se propunha a auxiliar o desenvolvedor a se valer de um recurso indispensvel na atual fase de evoluo da informtica no mundo o banco de dados. Desta forma, o desenvolvedor teria na mesma fonte os recursos para fazer suas aplicaes e tambm os meios necessrios para criar e manipular dados armazenados, atravs dos objetos persistidos gerados pelo Hibernate. Mas como toda soluo definitiva, no se mostrou to definitiva assim! Para bancos de dados gigantescos o Hibernate apresenta deficincias, causadas por fatores como o grande trafego de rede gerado pelas constantes requisies entre as camadas do Hibernate [Minter e Linwood, 2006], o que gera latncia no sistema ao ponto de inviabilizar seu funcionamento pelas requisies atingirem os timeouts estipulados. Tcnicas para otimizao do Hibernate surgem todos os dias. Como a simples e eficiente tcnica do chamado carregamento preguioso, que visa otimizar a recuperao de objetos recuperando apenas partes deles, as partes que realmente so requeridas nas queries feitas. Mas visando-se a evoluo natural dos hardwares usados, bem como a dominao cada vez maior de solues Java, patente que o Hibernate ainda no alcanou o que pode alcanar. Em um mundo cada vez mais dinmico e orientaado a objetos, uma soluo conjunta de manipulao e persistncias de dados, aliada a uma linguagem cada vez mais popular e plenamente confivel (isso sem falar de totalmente portvel) tende a crescer e crescer, cada vez mais, corrigindo seus erros, adequando incompatibilidades, e otimizando eficincias.

Referncias Bibliogrficas:

Minter, Dave e Linwood, Jeff (2006) Beginning Hibernate From Novice to Professional. An Introduction to all the new features of the Hibernate 3.2 persistence API, publicado pela editora Apress Inc, USA; Bauer, Christian e Kigin, Gavin (2007) Java Persistence With Hibernate, impresso pela editora Hanning, USA; Peak, Patrick e Heudecker, Nick (2006) Hibernate Quickly, impresso pela editora Hanning, USA.

Você também pode gostar