Você está na página 1de 18

Comunidade Livre Paraba

http://www.softwarelivre.pb.gov.br/

Introduo ao Hibernate 3
Maurcio Linhares
Mapeie o seu modelo de objetos diretamente para o banco de dados, de uma forma simples e se livrando de vez da SQL

O que o Hibernate?
O Hibernate uma ferramenta de mapeamento objeto/rela ional para !ava. "la transforma os dados tabulares de um ban o de dados em um grafo de objetos definido pelo desenvolvedor. #sando o Hibernate$ o desenvolvedor se livra de es rever muito do %digo de a esso a ban o de dados e de &'L (ue ele es reveria n)o usando a ferramenta$ a elerando a velo idade do seu desenvolvimento de uma forma fant*sti a. +as o framewor, n)o uma boa op-)o para todos os tipos de apli a-)o. &istemas (ue fa.em uso e/tensivo de stored pro edures$ triggers ou (ue implementam a maior parte da l%gi a da apli a-)o no ban o de dados$ ontando om um modelo de objetos 0pobre1 n)o vai se benefi iar om o uso do Hibernate. "le mais indi ado para sistemas (ue ontam om um modelo ri o$ onde a maior parte da l%gi a de neg% ios fi a na pr%pria apli a-)o !ava$ dependendo pou o de fun-2es espe fi as do ban o de dados.

Antes de voc seguir em frente...


Antes de comear voc deve fazer o download de uma verso estvel do Hibernate 3, de preferncia a verso 3.0.5, com a ual este arti!o foi testado. "oc pode encontrar os ar uivos dela a ui# $ttps#%%sourcefor!e.net%pro&ect%s$owfiles.p$p'!roup(id)*0+,-.pac/a!e(id),-++0* 1epois de fazer o download, adicione o ar uivo $ibernate3.&ar e os se!uintes ar uivos da pasta 2lib3 do download ao seu classpat$ 4ou ao classpat$ da sua 5167# ehcache-1.1.jar jta.jar xml-apis.jar commons-logging-1.0.4.jar c3p0-0.8.5.2.jar asm-attrs.jar log4j-1.2.9.jar dom4j-1.6.jar antlr-2.7.5H3.jar cglib-2.1.jar asm.jar jdbc2 0-stdext.jar xerces-2.6.2.jar commons-collections-2.1.1.jar 8 banco de dados escol$ido para este arti!o 9 o :;<=>, verso *.,, mas os scripts <=> pra !erar as tabelas podem ser facilmente adaptados para outros bancos. ?sando o :;<=> voc tamb9m vai ter ue colocar o driver @1AB dele no seu classpat$, ele pode ser baiCado no se!uinte endereo 4a verso utilizada no arti!o foi a 3.,.07# $ttp#%%dev.m;s l.com%downloads%connector%&%3.,.$tml Al9m do driver do :;<=>, voc tamb9m vai ter ue adicionar os ar uivos .@AD ue esto na pasta 2lib3 do ar uivo do driver, o 2aspect&rt.&ar3 e o 2aspect&tools.&ar3.

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

"oc tamb9m deve criar o banco de dados, usando o ar uivo 2banco.s l3 ue est &unto com os outros aneCos desse arti!o.

6este artigo vo 7 vai onhe er um pou o sobre os mapeamentos do Hibernate e a H'L$ a linguagem de bus as do framewor,. O artigo assume (ue vo 7 j* tenha um onhe imento sobre a linguagem !ava$ ban os de dados e 8+L$ alm de ser apa. de montar um ambiente de desenvolvimento !ava om todas as onfigura-2es ne ess*rias.

Definindo os objetos do modelo e as tabelas do banco


O nosso modelo simples$ ele modela um adastro de alunos em uma universidade. 6ele n%s temos as lasses$ Pessoa$ 9luno$ Professor$ "ndere-o$ :urma$ ;is iplina e Curso$ (ue se rela ionam omo mostrado no seguinte diagrama:

9 lasse essoa$ (ue tem um !ndereo$ a lasse base para as lasses "luno e rofessor. #m "luno pode estar em v*rias #urmas$ assim omo um rofessor. Cada #urma pode ter v*rios "lunos e apenas um rofessor. 9 #urma tem ainda uma Disci$lina$ (ue pode onter v*rias #urmas e (ue tem um %urso$ (ue tambm pode ter v*rias Disci$linas. Com um modelo de objetos tabelas$ neste diagrama: riado$ vejamos omo essas lasses poderiam ser transformadas em

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina <

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

Como vo 7 j* deve ter per ebido$ n)o h* nada demais om esse modelo de ban o de dados$ as tabelas est)o interligadas normalmente usando haves prim*rias e haves estrangeiras e uma tabela de rela ionamento$ no aso da rela-)o 6:6 entre 9luno e :urma = use o s ript para riar as tabelas (ue est* nos materiais ane/os ao artigo>. 9s tabelas tem as mesmas propriedades das lasses e os mesmos rela ionamentos.

Dando nome aos bois


=uando estiver mapeando as suas classes do modelo para o banco de dados, tente usar os mesmos nomes das classes e de suas propriedades, isso vai evitar vrias dores de cabea, como no saber se o nome 2da uela3 propriedade 9 todo em maiEsculas, ou se tem um 2(3 4underline7 entre um nome e outro. Al9m do ue, se os nomes forem i!uais, voc no precisa repetir os nomes das tabelas e dos relacionamentos no mapeamento do Hibernate.
9gora (ue j* temos as nossas lasses e elas foram mapeadas para o ban o$ podemos ome-ar a trabalhar om os mapeamentos do Hibernate$ pra fa.er om (ue a(uelas tabelas do ban o se transformem nas nossas lasses do modelo$ (uando fi.ermos a esso ao ban o de dados.

Ma$eando as classes $ara as tabelas


9ntes de ome-ar a fa.er os mapeamentos do Hibernate$ temos um on eito do ban o de dados (ue pre isa ser revisto$ a identidade. Para um ban o de dados$ o modo de diferen iar uma linha das outras$ usando haves$ de prefer7n ia haves n)o naturais$ omo as olunas 0id1 (ue n%s riamos para nossas tabelas$ mas no nosso modelo orientado a objetos$ a identidade n)o en ontrada dessa forma. "m !ava$ n%s definimos a identidade dos objetos sobres revendo o mtodo 0Obje t.e(uals=Obje t obje t>1$ do modo (ue nos onvier. 9 implementa-)o 0default1 deste mtodo$ define a identidade atravs da posi-)o de mem%ria o upada pelo objeto. 6)o podemos usar o mtodo 0e(uals=>1 no ban o de dados$ por(ue o ban o de dados n)o sabe (ue temos objetos$ ele s% entende tabelas$ haves prim*rias e estrangeiras. 9 solu-)o adi ionar aos nossos objetos um identifi ador n)o natural$ omo os (ue n%s en ontramos no ban o de dados$ por(ue assim o ban o de dados e o pr%prio Hibernate v)o ser apa.es de diferen iar os objetos e montar os seus rela ionamentos. 6%s fa.emos isso adi ionando uma propriedade hamada 0id1 do tipo ?nteger a todas as nossas lasses$ omo no e/emplo de %digo a seguir:

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina @

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ !!"istagem#do#ar$%i&o#'essoa.ja&a p%blic#class#'essoa#( # pri&ate#)tring#nome* # pri&ate#)tring#email* # pri&ate#)tring#tele+one* # pri&ate#,ndereco#endereco* pri&ate#-nteger#id* !!m.todos#getters#e#setters#das#propriedades /

Poderamos ter es olhido o tipo primitivo 0int1 para a propriedade$ mas trabalhando om objetos$ o mapeamento e a resolu-)o se um objeto e/iste ou n)o no ban o de dados tornaAse mais simples para o Hibernate. Outra observa-)o importante s)o os mtodos 0getters1 e 0setters1 para as propriedades dos objetos. O Hibernate n)o pre isa de (ue as propriedades sejam definidas usando a nomen latura dos !avaBeans$ mas isso j* uma boa pr*ti a omum na omunidade$ alm de e/istirem outros framewor,s e te nologias (ue e/igem essa nomen latura = omo a "/pression Language dos !&Ps>$ ent)o n%s definimos mtodos 0getters1 e 0setters1 para todas as propriedades nos nossos objetos.

%onhecendo o arqui&o 'hmb()ml* e ma$eando um relacionamento +,+


Cortemos a onversa fiada e vamos ini iar a onstru-)o dos mapeamentos. O primeiro mapeamento abordado o da lasse Pessoa e do seu rela ionamento om a lasse "ndere-o. 6o nosso modelo$ um "ndere-o tem apenas uma Pessoa e uma Pessoa tem apenas um "ndere-o =per eba (ue o ar(uivo .java e o nome da lasse !ava (ue modela "ndere-o n)o tem o 0-1$ fi ou "ndere o$ para fi ar om o mesmo nome da tabela>. Cejamos o mapeamento para a lasse Pessoa =o ar(uivo 0Pessoa.hbm./ml1>:

Nomes de arquivos e extenses


F uma boa prtica usar um ar uivo de mapeamento para cada classe e usar como eCtenso do ar uivo 2.$bm.Cml3 para diferenciar de outros ar uivos G:> utilizados na aplicao.

01xml#&ersion231.03#encoding23456-8317 089:;5<',#hibernate-mapping# '4="-;#3-!!Hibernate!Hibernate#>apping#959#3.0!!,?3 ####3http@!!hibernate.so%rce+orge.net!hibernate-mapping-3.0.dtd37 0hibernate-mapping7 #0class#name23'essoa37 ## ##08--#-denti+icador#da#classe#--7 ##0id#name23id37 ###0generator#class23increment3!7 ##0!id7 ## ##08--#'ropriedades#da#classe#--7 ##0propertA#name23nome3!7 ##0propertA#name23tele+one3!7 ##0propertA#name23email3!7 # ##08--#Belacionamento#da#classe#--7 ##0one-to-one# ## name23endereco3# ## class23,ndereco3 ## cascade23sa&e-%pdate3!7 # 3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina D

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ #0!class7 0!hibernate-mapping7

O ar(uivo de mapeamento um ar(uivo 8+L (ue define as propriedades e os rela ionamentos de uma lasse para o Hibernate$ este ar(uivo pode onter lasses$ lasses omponentes e (ueries em H'L ou em &'L. 6o nosso e/emplo$ temos apenas uma lasse sendo mapeada no ar(uivo$ a lasse Pessoa. O ar(uivo 8+L ome-a normalmente om as defini-2es da ;:; e do n% rai.$ o 0hibernate-mapping7$ depois vem o n% (ue nos interessa neste aso$ 0class7. 6o n% 0class7#n%s definimos a lasse (ue est* sendo mapeada e para (ual tabela ela vai ser mapeada. O Eni o atributo obrigat%rio deste n% 0name1$ (ue deve onter o nome ompleto da lasse = om o pa ote$ se ele n)o tiver sido definido no atributo 0pacCage1 do n% 0hibernate-mapping7>$ se o nome da lasse for diferente do nome da tabela$ vo 7 pode olo ar o nome da tabela no atributo 0table1$ no nosso e/emplo isso n)o ne ess*rio. &eguindo em frente no nosso e/emplo$ temos o n% 0id7 (ue o identifi ador dessa lasse no ban o de dados. 6este n% n%s definimos a propriedade (ue guarda o identifi ador do objeto no atributo 0name1$ (ue no nosso aso 0id1$ se o nome da oluna no ban o de dados fosse diferente da propriedade do objeto$ ela poderia ter sido definida no atributo 0col%mn1. 9inda dentro deste n%$ n%s en ontramos mais um n%$ o 0generator7$ este n% guarda a informa-)o de omo os identifi adores =as haves do ban o de dados> s)o gerados$ e/istem diversas lasses de geradores$ (ue s)o definidas no atributo 0class1 do n%$ no nosso aso o gerador usado o 0in rement1$ (ue in rementa um ao valor da have sempre (ue insere um novo objeto no ban o$ esse gerador ostuma fun ionar normalmente em todos os ban os. Os pr%/imos n%s do ar(uivo s)o os 0propertA7 (ue indi am propriedades simples dos nossos objetos$ omo &trings$ os tipos primitivos =e seus wrappers>$ objetos ;ate$ Calendar$ Lo ale$ Curren F e outros. 6este n% os atributos mais importante s)o 0name1$ (ue define o nome da propriedade$ 0col%mn1 para (uando a propriedade n)o tiver o mesmo nome da oluna na tabela e 0tApe1 para definir o tipo do objeto (ue a propriedade guarda. 6ormalmente$ o pr%prio Hibernate apa. de des obrir (ual o tipo de objeto (ue a propriedade guarda$ n)o sendo ne ess*rio es rever isso no ar(uivo de onfigura-)o$ ele tambm usa o mesmo nome da propriedade para a essar a oluna$ se o atributo n)o tiver sido preen hido. 6%s definimos as tr7s propriedades simples da nossa lasse$ 0nome1$ 0email1 e 0telefone1. O Eltimo n% do ar(uivo$ 0one-to-one7D define o rela ionamento de 5AparaA5 (ue a lasse Pessoa tem om a lasse "ndere-o. "ste n% tem os atributos 0name1$ (ue define o nome da propriedade no objeto =neste aso$ 0endere o1>$ 0tApe1 (ue define a lasse da propriedade e 0cascade1 (ue define omo o Hibernate deve 0 as atear1 as a-2es feitas nesta lasse para a lasse rela ionada$ omo atuali.a-2es$ inser-2es e e/ lus2es de registro. 6o nosso aso o 0cascade1 foi es olhido omo 0saveAupdate1 para (ue (uando uma lasse pessoa for inserida ou atuali.ada no ban o$ a propriedade 0endere o1 tambm seja inserida ou atuali.ada. Com isso$ terminamos o mapeamento da nossa lasse Pessoa$ mas este mapeamento fa. refer7n ia a uma outra lasse o Hibernate ainda n)o onhe e$ a lasse "ndere o. Cejamos ent)o omo fi a o mapeamento desta lasse =o ar(uivo o 0"ndere o.hbm./ml1>:
01xml#&ersion231.03#encoding23456-8317 089:;5<',#hibernate-mapping# '4="-;#3-!!Hibernate!Hibernate#>apping#959#3.0!!,?3 ####3http@!!hibernate.so%rce+orge.net!hibernate-mapping-3.0.dtd37 0hibernate-mapping7 0class#name23,ndereco37 0id#name23id3 col%mn23'essoa id37 0generator#class23+oreign37 0param#name23propertA37pessoa0!param7 0!generator7 0!id7 0propertA#name23bairro3!7 0propertA#name23cidade3!7 0propertA#name23complemento3!7 0propertA#name23estado3!7 0propertA#name23n%mero3!7 3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina G

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ 0propertA#name23r%a3!7 0propertA#name23cep3!7 0one-to-one# name23pessoa3# class23'essoa3 constrained23tr%e3!7 0!class7 0!hibernate-mapping7

Como vo 7 agora j* onhe e a estrutura b*si a do ar(uivo de mapeamento$ vejamos as diferen-as deste ar(uivo para o 0Pessoa.hbm./ml1. 9 primeira oisa (ue vo 7 deve estar notando$ (ue o atributo 0class1 do n% 0generator7 n)o 0in rement1$ 0foreign1 e agora tambm temos um orpo do n%$ om o valor 0pessoa1. ?sso a onte e devido ao tipo de rela ionamento (ue n%s riamos no ban o de dados$ entre as tabelas "ndere o e Pessoa. :ambm e/iste mais um n% dentro de 0generator7 (ue n)o e/istia no mapeamento anterior$ o 0param7$ esse n% serve para passar um parHmetro para a lasse geradora do identifi ador$ (ue neste aso o nome da propriedade 0dona1 deste objeto$ 0pessoa1. Para garantir (ue ada "ndere o perten-a a apenas uma Pessoa$ fi.emos om (ue a have prim*ria de "ndere o =PessoaIid> fosse tambm a have estrangeira (ue a liga a Pessoa$ desse modo$ garantimos (ue ada "ndere o perten e a apenas uma Pessoa e vi eAversa. Outra novidade (ue tambm tivemos (ue olo ar o nome da oluna da have j* (ue ela n)o igual a o nome da propriedade da lasse$ a propriedade se hama 0id1 e a oluna 0PessoaIid1$ assim$ tivemos (ue de larar o atributo 0col%mn1 do n% 0id7. Continuando no mapeamento$ en ontramos as propriedades simples da lasse$ (ue s)o de laradas de modo id7nti o as (ue n%s vimos no mapeamento anterior$ om o n% 0propertA7 e om o atributo 0name1 ontendo o nome da propriedade. +ais uma ve. n)o indi amos o nome da oluna =por(ue os nomes s)o iguais as propriedades> nem o tipo$ j* (ue o Hibernate pode des obrir isso so.inho. 6o nosso modelo$ o rela ionamento entre Pessoa e "ndere o bidire ional$ o (ue (uer di.er (ue sempre possvel navegar de um objeto para o outro$ pois Pessoa aponta para "ndere o e "ndere o aponta para Pessoa. Para simboli.ar isso no mapeamento$ n%s temos (ue adi ionar o n% (ue tambm e/iste no mapeamento de Pessoa$ 0one-to-one7. Como vo 7 j* per ebeu$ os atributos ontinuam os mesmos$ 0name1 omo sendo o nome da propriedade na lasse e 0class1 omo sendo o nome da lasse dessa propriedade. +as n%s temos um atributo (ue n)o e/istia na rela-)o anterior$ 0constrained1$ (ue nessa rela-)o vai signifi ar (ue e/iste uma rela-)o entre a have prim*ria de "ndere o e de Pessoa$ avisando ao Hibernate (ue um "ndere o n)o pode e/istir sem (ue e/ista uma Pessoa$ assim$ mesmo (ue o ban o de dados n)o garantisse a integridade referen ial do sistema$ o pr%prio Hibernate garantiria.

Ma$eando herana
Continuando o trabalho de mapear o nosso modelo para o Hibernate$ vamos para a heran-a (ue n%s en ontramos entre Pessoa$ 9luno e Professor. Pessoa a lasse pai$ da (ual 9luno e Professor herdam as propriedades e omportamentos. 6o Hibernate e/istem diversas formas de se fa.er o mapeamento de uma rela-)o de heran-a. #sando uma tabela para ada lasse filha =a lasse pai n)o teria tabela$ as propriedades omuns se repetiriam nas tabelas filhas>$ usando uma tabela para todas as lasses =dis riminadores definiriam (uando uma lasse ou outra>$ usando uma tabela para ada uma das lasses =uma para a lasse pai e mais uma para ada lasse filha> ou at mesmo uma mistura de todas essas possibilidades =disponvel apenas na vers)o @ do Hibernate>. Ji ou onfusoK 6)o se preo upe$ neste artigo n%s vamos abordar apenas a mais omum e mais simples de ser mantida$ uma tabela para ada lasse. 6o nosso ban o de dados$ temos uma tabela Pessoa e outras duas tabelas$ 9luno e Professor$ (ue est)o rela ionadas a professor travs de suas haves prim*rias a tabela Pessoa$ garantindo assim (ue n)o e/istam 9lunos ou Professores om o mesmo identifi ador. Cejamos ent)o o mapeamento da lasse Professor =o ar(uivo 0Professor.hbm./ml1>:
01xml#&ersion231.03#encoding23456-8317 089:;5<',#hibernate-mapping# '4="-;#3-!!Hibernate!Hibernate#>apping#959#3.0!!,?3 3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina L

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ ####3http@!!hibernate.so%rce+orge.net!hibernate-mapping-3.0.dtd37 0hibernate-mapping7 0joined-s%bclass#name23'ro+essor3#extends23'essoa37 0CeA#col%mn23'essoaIid3!7 0propertA#name23tit%lo3!7 0set#name23t%rmas3 #in&erse23tr%e37 0CeA#col%mn23'essoaI'ro+essorIid3!7 0one-to-manA#class235%rma3!7

0!set7

0!joined-s%bclass7 0!hibernate-mapping7

6esse mapeamento vemos um n% (ue n%s ainda n)o onhe amos$ 0joined-s%bclass7$ (ue indi a o mapeamento de heran-a usando uma tabela para ada lasse$ por(ue para retornar o objeto o Hibernate pre isa fa.er um 0join1 entre as duas tabelas. O atributo 0name1 o nome da lasse mapeada e o atributo 0extends1 re ebe o nome da lasse pai =neste aso$ Pessoa>$ se o nome da lasse n)o fosse igual ao da tabela$ poderamos adi ionar o nome da tabela no atributo 0table1 =(ue foi omitido por(ue o nome da lasse igual ao nome da tabela>. &eguindo no mapeamento$ per ebemos mais um n% des onhe ido$ 0CeA7. "ste n% avisa ao Hibernate o nome da oluna (ue guarda a have prim*ria da tabela$ (ue tambm a have estrangeira (ue liga a tabela Professor a tabela Pessoa. 6este n% n%s adi ionamos o atributo 0col%mn1 e olo amos o nome da oluna (ue guarda a have$ (ue 0PessoaIid1. O mapeamento ontinua om a de lara-)o de uma propriedade e om um n% (ue n%s tambm n)o onhe emos$ 0set7$ (ue pode simboli.ar um rela ionamento 5:6 ou 6:6. "ste n% vai ser e/pli ado mais tarde neste artigo. Passando para o mapeamento da lasse 9luno$ per ebemos (ue n)o e/iste muita diferen-a:
01xml#&ersion231.03#encoding23456-8317 089:;5<',#hibernate-mapping# '4="-;#3-!!Hibernate!Hibernate#>apping#959#3.0!!,?3 ####3http@!!hibernate.so%rce+orge.net!hibernate-mapping-3.0.dtd37 0hibernate-mapping7 0joined-s%bclass#name23El%no3#extends23'essoa37 0CeA#col%mn23'essoaIid3!7 0propertA#name23matric%la3!7 0set#name23t%rmas3 #table235%rmaIhasIEl%no3 #in&erse23tr%e37 # 0CeA#col%mn235%rmaIid3!7 0manA-to-manA#class235%rma3!7 0!set7 0!joined-s%bclass7 0!hibernate-mapping7

9 lasse de larada do mesmo modo (ue Professor$ usando o n% 0joined-s%bclass7 e usando os mesmos atributos (ue foram usados no mapeamento anterior. O n% 0CeA7 tambm foi in ludo do mesmo modo$ om o nome da oluna da have prim*ria/estrangeira da tabela$ mais uma de lara-)o de propriedade e mais um n% 0set7$ nada alm do (ue j* foi visto.

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina M

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

Ma$eando associa-es +,. e .,.


Co 7 j* onhe eu o n% 0set7 nos mapeamentos anteriores$ vamos entender agora omo ele fun iona e omo utili.*Alo para tornar o a esso aos objetos asso iados ainda mais simples$ mais uma ve. sem nenhuma linha de &'L. #ma 0set1 ou 0 onjunto1 representa uma ole-)o de objetos n)o repetidos$ (ue podem ou n)o estar ordenados =dependendo da implementa-)o da interfa e java.util.&et es olhida>. 'uando vo 7 adi iona um n% deste tipo em um ar(uivo de mapeamento$ vo 7 est* indi ando ao Hibernate (ue o seu objeto tem um rela ionamento 5:6 ou 6:6 om outro objeto. Cejamos o e/emplo da lasse Professor$ (ue tem um rela ionamento 5:6 om a lasse :urma:
0joined-s%bclass#name23'ro+essor3#extends23'essoa37 0CeA#col%mn23'essoaIid3!7 0propertA#name23tit%lo3!7 0set#name23t%rmas3 #in&erse23tr%e37 0CeA#col%mn23'essoaI'ro+essorIid3!7 0one-to-manA#class235%rma3!7 0!set7 0!joined-s%bclass7

6o n% 0set7 o primeiro atributo a ser en ontrado 0name1 (ue assim omo nos outros n%s$ define o nome da propriedade (ue est* sendo tratada$ j* o outro atributo$ 0in&erse1$ define omo o Hibernate vai tratar a inser-)o e retirada de objetos nessa asso ia-)o. 'uando um lado da asso ia-)o define o atributo 0in&erse1 para 0true1 ele est* indi ando (ue apenas (uando um objeto for inserido do 0outro lado1 da asso ia-)o ele deve ser persistido no ban o de dados. Para entender melhor o atributo 0in&erse1 pense em omo est* definido o mapeamento da lasse Professor. L* ele est* definido para 0true1$ signifi ando (ue apenas (uando uma :urma adi ionar um professor$ o rela ionamento vai ser persistido no ban o de dados. "m %digo:
'ro+essor#pro+essor#2#neF#'ro+essorGH* 5%rma#t%rma#2#neF#5%rmaGH* t%rma.set'ro+essorGpro+essorH* pro+essor.get5%rmasGH.addGt%rmaH*

&e apenas o Professor adi ionando a :urma a sua ole-)o de :urmas$ nada iria a onte er ao ban o de dados. ?sso pare e n)o ter muito sentido$ mas se vo 7 prestar bem aten-)o$ o Hibernate n)o tem omo saber (ual dos dois lados foi atuali.ado$ desse modo ele vai sempre atuali.ar os dois lados duas ve.es$ uma para ada lasse da rela-)o$ o (ue seria desne ess*rio. #sando 0in&erse1 vo 7 define de (ual lado o Hibernate deve esperar a atuali.a-)o e ele vai fa.er a atuali.a-)o apenas uma ve.. LembreAse sempre de adi ionar os objetos dos dois lados$ pois em !ava os rela ionamentos n)o s)o naturalmente bidire ionais. Coltando a o n% 0set7$ per ebemos (ue dentro dele ainda e/istem mais dois n%s$ 0CeA7 e 0one-tomanA7. O n% 0CeA7 representa a oluna da tabela rela ionada =neste aso$ :urma> (ue guarda a have estrangeira para a lasse Professor$ n%s adi ionamos o atributo 0col%mn1 e o valor o nome da oluna$ (ue neste aso 0PessoaIProfessorIid1. 6o outro n%$ 0one-to-manA7$ n%s definimos a lasse a (ual perten e essa ole-)o de objetos$ (ue :urma =lembreAse sempre de usar o nome ompleto da lasse$ om o pa ote>.

;epois do rela ionamento umAparaAmuitos =5:6> vejamos agora omo mapear um rela ionamento muitosAparaAmuitos =6:6>. "m um ban o de dados rela ional$ este tipo de asso ia-)o fa. uso de uma 0tabela de rela-)o1$ (ue guarda as haves estrangeiras das duas tabelas asso iadas$ omo o orre no nosso e/emplo$ onde tivemos (ue riar uma tabela 0:urmaIhasI9luno1$ para poder mapear o rela ionamento 6:6 entre as lasses :urma e 9luno no ban o de dados. Como vo 7 j* sabe$ este tipo de asso ia-)o tambm definida usando o n% 0set7/ vejamos ent)o o nosso e/emplo:
3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina N

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

0joined-s%bclass#name23El%no3#extends23'essoa37 0CeA#col%mn23'essoaIid3!7 0propertA#name23matric%la3!7 0set#name23t%rmas3 #table235%rmaIhasIEl%no3 #in&erse23tr%e37 # 0CeA#col%mn23El%noI'essoaIid3!7 0manA-to-manA#class235%rmaI#col%mn2I5%rmaIidI!7 0!set7 0!joined-s%bclass7

Os atributos do n% 0set7 neste mapeamento s)o pare idos om os (ue n%s vimos no mapeamento da lasse Professor$ mas eles ontm algumas informa-2es adi ionais gra-as ao tipo da asso ia-)o. Primeiro$ temos um novo atributo no n% 0set7$ o 0table1. Como n%s havamos falado antes$ para uma asso ia-)o 6:6 vo 7 pre isa de uma 0tabela de rela ionamento1 e o atributo 0table1 guarda o nome desta tabela. +ais uma ve. o atributo 0in&erse1 foi mar ado omo 0true1 indi ando (ue apenas as a-2es feitas do 0outro lado1 da asso ia-)o v)o ser persistidas no ban o de dados. ;entro do n%$ n%s en ontramos mais dois n%s$ 0CeA7$ (ue vai onter$ no atributo 0col%mn1$ o nome da oluna (ue guarda a have estrangeira para a tabela 9luno e o n% 0manA-to-manA7$ (ue ontm a lasse dos objetos da ole-)o$ no atributo 0class1 e o nome da oluna na 0tabela de rela ionamento1 (ue referen ia a have prim*ria da tabela :urma$ no atributo 0col%mn1. Camos agora terminar de mapear as nossas outras lasses do nosso modelo e tornar as asso ia-2es bidire ionais$ omo manda o nosso modelo de lasses. Come-ando pela lasse :urma:
01xml#&ersion231.03#encoding23456-8317 089:;5<',#hibernate-mapping# '4="-;#3-!!Hibernate!Hibernate#>apping#959#3.0!!,?3 ####3http@!!hibernate.so%rce+orge.net!hibernate-mapping-3.0.dtd37 0hibernate-mapping7 0class#name235%rma37 0id#name23id37 0generator#class23increment3!7 0!id7 0propertA#name23nome3!7 0manA-to-one# name23pro+essor3 class23'ro+essor3 col%mn23'ro+essorI'essoaIid3!7 name23disciplina3 class239isciplina3 col%mn239isciplinaIid3!7

0manA-to-one

0set#name23al%nos3 #table235%rmaIhasIEl%no37 0CeA#col%mn235%rmaIid3!7 0manA-to-manA# class23El%no3# col%mn23El%noI'essoaIid3!7 0!set7 0!class7 0!hibernate-mapping7

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina O

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

9 maior parte do %digo j* onhe ida$ mas ainda e/istem algumas oisas (ue pre isam ser es lare idas. :urma o lado 0um1 de dois rela ionamentos umAparaAmuitos$ um om a lasse Professor e outro om a lasse ;is iplina$ para tornar essa asso ia-)o bidire ional n%s vamos utili.ar o n% 0manA-toone7$ (ue modela o lado 0um1 de uma asso ia-)o umAparaAmuitos =5:6>. 6este n%$ n%s inserimos os atributos 0name1$ (ue re ebe o nome da propriedade$ 0class1$ (ue re ebe o nome da lasse da propriedade e 0col%mn1$ (ue re ebe o nome da oluna nesta tabela (ue guarda a have estrangeira para a outra tabela do rela ionamento. O resto do mapeamento id7nti o aos outros mapeamentos (ue n%s j* estudamos$ a Eni a diferen-a o lado da asso ia-)o (ue ele est* modelando. Os dois outros mapeamentos$ de ;is iplina e Curso$ n)o tra.em nenhuma novidade para o nosso estudo$ portanto esteja livre para estudar os ar(uivos junto om o resto do material de apoio.

Cuidado com a descoberta automtica de tipos


8 Hibernate realmente facilita a vida do desenvolvedor com a descoberta automtica dos tipos das propriedades, mas em al!uns momentos voc vai ter ue definir o tipo da propriedade, para ue o Hibernate no entre em conflito com o banco. ?m tipo &ava.util.1ate, por eCemplo, pode simbolizar tanto um tipo 21AH63 uanto um 2H5:6<HA:I3 em um banco de dados, por isso, voc deve avisar ao Hibernate o ue ele est mapeando, se 9 um 21AH63 ou um 2H5:6<HA:I3, no atributo 2tApe3 da propriedade. 6sse mesmo cuidado tamb9m deve ser tomado para B>8As, A>8As e a classe &ava.util.Balendar.

%onfi0urando o Hibernate 3
9 engine do Hibernate pode ser onfigurada de tr7s modos diferentes$ instan iando um objeto de onfigura-)o =or0(hibernate(cf0(%onfi0uration> e inserindo as suas propriedades programati amente$ usando um ar(uivo .properties om as suas onfigura-2es e indi ando os ar(uivos de mapeamento programati amente ou usando um ar(uivo 8+L =o 0hibernate. fg./ml1> om as propriedades de ini iali.a-)o e os aminhos dos ar(uivos de mapeamento. Cejamos omo onfigurar o Hibernate para o nosso projeto:
089:;5<',#hibernate-con+ig%ration#'4="-; 3-!!Hibernate!Hibernate#;on+ig%ration#959#3.0!!,?3 3http@!!hibernate.so%rce+orge.net!hibernate-con+ig%ration-3.0.dtd37 0hibernate-con+ig%ration7 0session-+actorA7 0propertA#name23hibernate.dialect37 org.hibernate.dialect.>A)J"9ialect 0!propertA7 0propertA#name23hibernate.connection.dri&erIclass37 com.mAs$l.jdbc.9ri&er 0!propertA7 0propertA#name23hibernate.connection.%rl37 jdbc@mAs$l@!!localhost!hibernate1a%toBeconnect2tr%e 0!propertA7 0propertA#name23hibernate.connection.%sername37 root 0!propertA7 0propertA#name23hibernate.connection.passFord37 0!propertA7 08--#;ondig%raKLo#do#c3p0#--7 0propertA#name23hibernate.c3p0.maxIsiMe37100!propertA7 0propertA#name23hibernate.c3p0.minIsiMe3720!propertA7 0propertA#name23hibernate.c3p0.timeo%t3750000!propertA7 0propertA#name23hibernate.c3p0.maxIstatements37100!propertA7 0propertA#name23hibernate.c3p0.idleItestIperiod3730000!propertA7 3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5P

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ 0propertA#name23hibernate.c3p0.ac$%ireIincrement3720!propertA7 08--#;on+ig%raKNes#de#deb%g#--7 ######## ######## ######## 0propertA#name23shoFIs$l37tr%e0!propertA7 0propertA#name23hibernate.generateIstatistics37tr%e0!propertA7 0propertA#name23hibernate.%seIs$lIcomments37tr%e0!propertA7 0mapping#reso%rce23;%rso.hbm.xml3!7 0mapping#reso%rce239isciplina.hbm.xml3!7 0mapping#reso%rce235%rma.hbm.xml3!7 0mapping#reso%rce23'essoa.hbm.xml3!7 0mapping#reso%rce23El%no.hbm.xml3!7 0mapping#reso%rce23'ro+essor.hbm.xml3!7 0mapping#reso%rce23,ndereco.hbm.xml3!7

0!session-+actorA7 0!hibernate-con+ig%ration7

6a do umenta-)o do Hibernate vo 7 pode verifi ar todas as op-2es de propriedades (ue podem ser utili.adas e seus respe tivos resultados$ por isso n%s vamos nos ater ao (ue importante para ome-armos a trabalhar. Cejamos as propriedades: hibernate.diale t: a implementa-)o do dialeto &'L espe fi o do ban o de dados a ser utili.ado. hibernate. onne tion.driverI lass: o nome da lasse do driver !;BC do ban o de dados (ue est* sendo utili.ado. hibernate. onne tion.url: a #QL de one/)o espe fi a do ban o (ue est* sendo utili.ado. hibernate. onne tion.username: o nome de usu*rio om o (ual o Hibernate deve se one tar ao ban o. hibernate. onne tion.password: a senha do usu*rio om o (ual o Hibernate deve se one tar ao ban o. "ssa segunda parte do ar(uivo s)o as onfigura-2es do 0pool1 de one/2es es olhido para a nossa apli a-)o. 6o nosso e/emplo o pool utili.ado o C@PP$ mas vo 7 poderia utili.ar (ual(uer um dos pools (ue s)o ofere idos no Hibernate ou ent)o usar um ;ata&our e do seu servidor de apli a-)o. 6a ter eira parte$ est)o algumas op-2es para ajudar a debugar o omportamento do Hibernate$ a propriedade 0showIs(l1 fa. om (ue todo o %digo &'L gerado seja es rito na sada default$ 0hibernate.generateIstatisti s1 fa. om (ue o Hibernate gere estatsti as de uso e possa diagnosti ar uma m* performan e do sistema e 0hibernate.useIs(lI omments1 adi iona oment*rios ao %digo &'L gerado$ fa ilitando o entendimento das (ueries. 9 Eltima parte do ar(uivo onde n%s indi amos os ar(uivos de mapeamento (ue o Hibernate deve pro essar antes de ome-ar a trabalhar$ se vo 7 es(ue er de indi ar um ar(uivo de mapeamento de (ual(uer lasse$ essa lasse n)o vai poder ser persistida pela engine do Hibernate. Outro detalhe importante$ (ue (uando vo 7 usa mapeamentos om Heran-a$ o mapeamento pai deve sempre vir antes do filho.

Persistncia em cascata
8s relacionamentos entre os ob&etos no Hibernate podem ser tratados com aJes 2em cascata3. 5sso si!nificaria, no nosso eCemplo, ue voc poderia inserir um ob&eto Iessoa no banco de dados e depois associar um 6ndereco a ele, sem ter de indicar ao Hibernate ue este ob&eto deve ser persistido no banco de dados. 6sse tipo de ao 9 definido pelo atributo 2cascade3 nos nKs de relacionamento 4LsetM, Lman;NtoNoneM, etc7. 6le pode assumir os se!uintes valores# 2none3 # o Hibernate i!nora a associao 2saveNupdate3 # ele vai inserir ou atualizar automaticamente os ob&etos associados, uando o ob&eto 2raiz3 for inserido ou atualizado 2delete3 # ele vai deletar os ob&etos associados ao ob&eto raiz 2all3 # uma &uno de 2delete3 e 2saveNupdate3 2allNdeleteNorp$an3 # o mesmo ue 2all3, mas o Hibernate vai deletar ual uer ob&eto ue tiver sido retirado da associao 2deleteNorp$an3 # faz com ue o Hibernate ve&a se o ob&eto ainda faz parte da associao, se ele no fizer, vai ser deletado
3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 55

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

!ntrando em "o
9gora (ue vo 7 j* est* om o Hibernate onfigurado e pronto para fun ionar$ vamos entender o me anismo de persist7n ia dele. Para o Hibernate$ e/istem tr7s tipos de objetos$ objetos 0transient1 =transientes>$ 0deta hed1 =desligados> e 0persistent1 =persistentes>. Objetos 0transient1 s)o a(ueles (ue ainda n)o tem uma representa-)o no ban o de dados =ou (ue foram e/ ludos>$ eles ainda n)o est)o sobre o ontrole do framewor, e podem n)o ser mais referen i*veis a (ual(uer momento$ omo (ual(uer objeto normal em !ava. Objetos 0deta hed1 t7m uma representa-)o no ban o de dados$ mas n)o fa.em mais parte de uma sess)o do Hibernate$ o (ue signifi a (ue o seu estado pode n)o estar mais sin roni.ado om o ban o de dados. Objetos 0persistent1 s)o os objetos (ue tem uma representa-)o no ban o de dados e (ue ainda fa.em parte de uma transa-)o do Hibernate$ garantindo assim (ue o seu estado esteja sin roni.ado om o ban o de dados =nem sempre$ laro>. 6o Hibernate$ assim omo no !;BC$ e/istem os on eitos de sess)o e transa-)o. #ma sess)o uma one/)o aberta om o ban o de dados$ onde n%s podemos e/e utar (ueries$ inserir$ atuali.ar e deletar objetos$ j* a transa-)o a demar a-)o das a-2es$ uma transa-)o fa. o ontrole do (ue a onte e e pode fa.er um roolba ,$ assim omo uma transa-)o do !;BC$ se forem en ontrados problemas. "dite o ar(uivo de onfigura-)o do Hibernate =hibernate. fg./ml> om as suas informa-2es espe fi as =nome de usu*rio$ senha$ #QL de one/)o$ et >$ olo(ue ele na rai. do seu lasspath$ junto om as lasses ompiladas e os ar(uivos de mapeamento$ por(ue n%s vamos olo ar o Hibernate pra fun ionar =tenha erte.a de (ue o seu lasspath est* onfigurado orretamente$ om todos os ar(uivos ne ess*rios>. Primeiro$ vamos riar uma lasse para onfigurar e abrir as sess2es do Hibernate$ o %digo simples:
!!Er$%i&o#Hibernate4tilitA.ja&a import#org.hibernate.)ession* import#org.hibernate.)ession6actorA* import#org.hibernate.c+g.;on+ig%ration* p%blic#class#Hibernate4tilitA#( ####pri&ate#static#)ession6actorA#+actorA* ######## ####static#( #### #### trA#( #### ########+actorA#2#neF#;on+ig%rationGH.con+ig%reGH.b%ild)ession6actorAGH* #### #### /#catch#G,xception#eH#( #### #### e.print)tacC5raceGH* #### +actorA#2#n%ll* #### / ####/ #### ####p%blic#static#)ession#get)essionGH#( ######## #### ret%rn#+actorA.open)essionGH* ######## ####/ #### /

O blo o est*ti o =as haves mar adas omo 0stati 1> instan ia um objeto de onfigura-)o do Hibernate =org.hibernate. fg.Configuration>$ hama o mtodo onfigure=> =(ue l7 o nosso ar(uivo hibernate. fg./ml> e depois (ue ele est* onfigurado$ riamos uma &essionJa torF$ (ue a lasse (ue vai fi ar respons*vel por abrir as sess2es de trabalho do Hibernate. Ja-a um pe(ueno teste pra ter erte.a de (ue tudo est* fun ionando:
!!Er$%i&o#5este.ja&a

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5<

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/ p%blic#class#5este#( p%blic#static#&oid#mainG)tringOP#argsH#( )ession#sessao#2#Hibernate4tilitA.get)essionGH*#!!Ebrindo#%ma#sessLo 5ransaction#transaction#2#sessao.begin5ransactionGH*##!!-niciando#%ma#transaKLo ;%rso#c%rso#2#neF#;%rsoGH*#!!-nstanciando#%m#objeto#transiente c%rso.set?omeG39esen&ol&imento#de#)o+tFare3H*#!!'reenchendo#as#propriedades#do#objeto c%rso.set9escricaoG3;%rso#sQ#pra#programadores3H* sessao.sa&eGc%rsoH* !!5rans+ormando#o#objeto#transiente#em#%m#objeto !!persistente#no#banco#de#dados

transaction.commitGH*##!!6inaliMando#a#transaKLo sessao.closeGH* #!!6echando#a#sessLo

&e ele n)o lan-ou nenhuma e/ e-)o$ o seu ambiente est* onfigurado orretamente. Camos entender agora o (ue foi (ue a onte eu neste %digo$ primeiro n%s ini iali.amos a &essionJa torF$ dentro do blo o est*ti o na lasse Hibernate#tilitF$ depois (ue ela ini iali.ada$ o mtodo getSession() retorna uma nova sess)o para o %digo dentro do main(). 9p%s a sess)o ter sido retornada$ n%s ini iamos uma transa-)o$ instan iamos um objeto Curso$ preen hemos as suas propriedades e hamamos o mtodo save=> na sess)o. 9p%s o mtodo save=>$ finali.amos a transa-)o e fe hamos a sess)o. 9 abamos de inserir um registro no ban o de dados sem es rever nenhuma linha de &'L$ apenas om a hamada de um mtodo. O %digo de apli a-2es (ue usam o Hibernate ostumam mostrar esse mesmo omportamento$ abrir sess)o$ in i iar transa-)o$ hamar os mtodos save=>$ update=>$ get=>$ delete=>$ et $ fe har a transa-)o e depois a sess)o$ um omportamento muito pare ido om o de apli a-2es !;BC omuns$ a diferen-a (ue n)o es revemos nem uma linha se(uer de &'L para tanto.

Nomes das classes


Oa maioria dos eCemplos, nKs no incluPmos os 2imports3 nem usamos os nomes completos das classes para facilitar a leitura, ve&a a ui al!uns dos nomes completos das classes ue voc vai encontrar# <ession ) or!.$ibernate.<ession <essionQactor; ) or!.$ibernate.<essionQactor; Bonfi!uration ) or!.$ibernate.cf!.Bonfi!uration Hransaction ) or!.$ibernate.Hransaction =uer; ) or!.$ibernate.=uer; Briteria ) or!.$ibernate.Briteria Briterion ) or!.$ibernate.criterion.Briterion Destrictions ) or!.$ibernate.criterion.Destrictions

1a2endo $esquisas no banco usando o Hibernate


9gora (ue vo 7 j* sabe mapear e onfigurar a fera$ podemos passar para uma das partes mais importantes do fun ionamento do framewor,$ as pes(uisas. "/istem tr7s meios de se fa.er bus as usando o Hibernate$ usando a sua linguagem pr%pria de bus as$ a Hibernate 'uerF Language =H3L>$ usando a sua %riteria 3uer4 " I =para montar bus as programati amente> e usando &'L puro. 9 maioria das suas ne essidades deve ser suprida om as duas primeiras alternativas$ o resto$ vo 7 sempre pode usar &'L pra resolver. 9 H'L uma e/tens)o da &'L om alguns adendos de orienta-)o a objetos$ nela vo 7 n)o vai referen iar tabelas$ vai referen iar os seus objetos do modelo (ue foram mapeados para as tabelas do ban o de dados. 9lm disso$ por fa.er per(uisas em objetos$ vo 7 n)o pre isa sele ionar as 0 olunas1 do ban o de dados$ um sele t assim: 0sele t R from :urma1 em H'L seria simplesmente 0from :urma1$ por(ue n)o estamos mais pensando em tabelas e sim em objetos.

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5@

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

9 Criteria 'uerF 9P? um onjunto de lasses para a montagem de (ueries em %digo !ava$ vo 7 define todas as propriedades da pes(uisa hamando os mtodos e avalia-2es das lasses rela ionadas. Como tudo definido programati amente$ vo 7 ganha todas as fun ionalidades inerentes da programa-)o orientada a objetos para montar as suas pes(uisas e ainda garante a ompleta independ7n ia dos ban os de dados$ pois a lasse de 0dialeto &'L1 do seu ban o vai se en arregar de tradu.ir tudo o (ue vo 7 utili.ar. 9ntes de ver os e/emplos propriamente ditos$ vejamos omo riar um objeto (ue implemente a interfa e 'uerF ou Criteria. Para instan iar um desses objetos$ vo 7 vai ter (ue abrir uma sess)o do Hibernate$ omo n%s j* vimos na listagem do ar(uivo 0:este.java1. Cejamos omo fi aria o %digo:
)ession#sessao#2#Hibernate4tilitA.get)essionGH* 5ransaction#tx#2#sessao.begin5ransactionGH* J%erA#select#2#sessao.createJ%erAG3+rom#5%rma3H* "ist#objetos#2#select.listGH* )Astem.o%t.printlnGobjetosH* tx.commitGH* sessao.closeGH*

O %digo ainda segue a(uela mesma se(S7n ia da listagem anterior$ abrir uma sess)o$ ini iar uma transa-)o e ome-ar a a essar o ban o de dados. Para riar uma (uerF$ n%s hamamos o mtodo createJ%erAG)tring#$%erAH na sess)o$ passando omo parHmetro o &tring (ue representa a (uerF. ;epois disso$ podemos hamar o mtodo listGH$ (ue retorna um 0List1 om os objetos resultantes da (uerF. #sando a Criteria 9P?$ o %digo fi aria desse modo:
)ession#sessao#2#Hibernate4tilitA.get)essionGH* 5ransaction#tx#2#sessao.begin5ransactionGH* ;riteria#select#2#sessao.create;riteriaG5%rma.classH* "ist#objetos#2#select.listGH* )Astem.o%t.printlnGobjetosH* tx.commitGH* sessao.closeGH*

Ceja (ue apenas a linha onde n%s ri*vamos a (uerF mudou. 9gora$ em ve. de hamar o mtodo hamamos o mtodo create;riteriaG;lass # claMMH$ passando omo parHmetro a lasse (ue vai ser pes(uisada$ (ue no nosso aso :uma.
createJ%erAG)tring # $%erAHD #n%s

Outro omplemento importante do Hibernate o suporte a pagina-)o de resultados. Para paginar os resultados$ n%s hamamos os mtodos set6irstBes%ltGint#+irstH e set>axBes%ltsGint#maxH. O primeiro mtodo indi a de (ual posi-)o os objetos devem ome-ar a ser arregados$ o segundo indi a o m*/imo de objetos (ue devem ser arregados. "stes mtodos est)o presentes tanto na interfa e 0'uerF1 (uanto na interfa e 0Criteria1. Cejamos omo n%s deveramos pro eder para arregar apenas as de. primeiras turmas do nosso ban o de dados:
)ession#sessao#2#Hibernate4tilitA.get)essionGH* 5ransaction#tx#2#sessao.begin5ransactionGH* ;riteria#select#2#sessao.create;riteriaG5%rma.classH* select.set6irstBes%ltG0H* select.set>axBes%ltsG10H* "ist#objetos#2#select.listGH* )Astem.o%t.printlnGobjetosH* tx.commitGH* sessao.closeGH*

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5D

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

Ceja (ue n%s hamamos os mtodos set6irstBes%ltGH e set>axBes%ltsGH antes de listar os objetos da (uerF e lembreAse tambm (ue a ontagem de resultados =assim omo os arraFs> ome-a em .ero$ n)o em um. #ma propriedade espe fi a da H'L$ (ue foi herdada do !;BC$ o uso de parHmetros nas (ueries. 9ssim omo no !;BC$ os parHmetros podem ser numerados$ mas tambm podem ser nomeados$ o (ue simplifi a ainda mais o uso e a manuten-)o das (ueries$ por(ue a tro a de posi-)o n)o vai afetar o %digo (ue as usa. Cejamos um e/emplo do uso de parHmetros:
)ession#sessao#2#Hibernate4tilitA.get)essionGH* 5ransaction#tx#2#sessao.begin5ransactionGH* J%erA#select#2#sessao.createJ%erAG3+rom#5%rma#as#t%rma#Fhere#t%rma.nome#2#@nome3H* select.set)tringG3nome3D#3Rornalismo3H* "ist#objetos#2#select.listGH* )Astem.o%t.printlnGobjetosH* tx.commitGH* sessao.closeGH*

6esse nosso novo e/emplo$ tivermos mais algumas adi-2es a (uerF H'L. 9 primeira o uso do 0as1$ (ue serve para 0apelidar1 uma lasse no na nossa e/press)o =do mesmo modo do 0as1 em &'L>$ ele n)o obrigat%rio$ o %digo poderia estar 0+rom#5%rma#t%rma#...1 e ele fun ionaria normalmente. Outra oisa a se notar$ o a esso as propriedades usando o operador 0.1 =ponto>$ vo 7 sempre a essa as propriedades usando esse operador. " a Eltima parte o parHmetro propriamente dito$ (ue deve ser ini iado om 0:1 =dois pontos> para (ue o Hibernate saiba (ue isso um parHmetro (ue vai ser inserido na (uerF. Co 7 insere um parHmetro nomeado$ usando o mtodo 0set1 orrespondente ao tipo de parHmetro$ passando primeiro o nome om o (ual ele foi inserido e depois o valor (ue deve ser olo ado. " se vo 7 tambm n)o gosta de fi ar metendo %digo &'L no meio do seu programa$ por(ue deveria meter %digo H'LK O Hibernate fa ilita a e/ternali.a-)o de (ueries H'L =e at &'L> om os n%s 0$%erA7 e 0s$l-$%erA7 nos ar(uivos de mapeamento. Camos adi ionar uma (uerF no mapeamento da lasse turma =o ar(uivo 0:urma.hbm./ml1>:
0$%erA#name23b%scar5%rmas'elo?ome37 08O;9E5EO+rom#5%rma#t#Fhere#t.nome#2#@nomePP7 0!$%erA7

"ssas linhas adi ionadas no ar(uivo de mapeamento v)o instruir o Hibernate a riar um Prepared&tatement para esse sele t$ fa.endo om (ue ele e/e ute mais r*pido e possa ser hamado de (ual(uer lugar do sistema. Co 7 deve preen her o atributo 0name1 om o nome pelo (ual esta (uerF deve ser hamada na apli a-)o e no orpo do n% vo 7 deve olo ar o %digo da (uerF$ de prefer7n ia dentro de uma tag C;9:9$ pra evitar (ue o parser 8+L entenda o (ue est* es rito na (uerF omo informa-2es para ele. Ceja omo e/e utar uma 0named (uerF1:
)ession#sessao#2#Hibernate4tilitA.get)essionGH* 5ransaction#tx#2#sessao.begin5ransactionGH* J%erA#select#2#sessao.get?amedJ%erAG3b%scar5%rmas'elo?ome3H* select.set)tringG3nome3D#3Rornalismo3H* "ist#objetos#2#select.listGH* )Astem.o%t.printlnGobjetosH* tx.commitGH* sessao.closeGH*

9 Eni a diferen-a para as outras listagens (ue em ve. de es revermos a (uerF dentro do %digo !ava$ ela fi ou e/ternali.ada no ar(uivo de mapeamento. Para instan iar o objeto$ hamamos o mtodo get?amedJ%erAG)tring#nameH$ passando omo parHmetro o nome da (uerF definido no atributo 0name1 no ar(uivo 8+L.
3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5G

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

"dicionando restri-es as $esquisas


Camos ver agora omo adi ionar restri-2es as nossas pes(uisas no Hibernate. Os e/emplos v)o seguir uma dinHmi a simples$ om uma vers)o em H'L e omo o mesmo e/emplo poderia ser feito usando a 9P? de Criteria.
betFeen$ not#betFeen$ in e not#in>$ vejamos um e/emplo em H'L: +rom#El%no#al#Fhere#al.endereco.n%mero#72#50

9 H'L e a 9P? de Criteria suportam todos os operadores de ompara-)o da &'L = 0$ 7$ 07$ 02$ 72$ 2$

O uso dos operadores de ompara-)o segue a mesma sinta/e da linguagem &'L$ usando Criteria$ essa mesma (uerF poderia ser e/pressa da seguinte maneira:
;riteria#select#2#sessao.create;riteriaGEl%no.classH* select.create;riteriaG3endereco3H .addG#Bestrictions.geG#3n%mero3D#neF#-ntegerG10H#H#H*

6%s riamos a o objeto Criteria usando a lasse 9luno$ mas a nossa restri-)o para a propriedade 0numero1 da lasse "ndere o (ue est* asso iada a lasse 9luno$ ent)o temos (ue 0des er1 um nvel$ para poder apli ar a restri-)o a propriedade 0numero1 de 0endere o1. #sando Criteria$ vo 7 pode usar os mtodos est*ti os da lasse 0org.hibernate.criterion.BestrictionsI para montar e/press2es. Os operadores l%gi os =e os par7nteses> tambm est)o a sua disposi-)o e em H'L eles ontinuam om a mesma sinta/e do &'L. Co 7 pode usar or$ and e par7nteses para agrupar as suas e/press2es. Cejamos um e/emplo:
+rom##,ndereco#end#Fhere# G#end.r%a#in#GS,pitTcio#'essoaID#S-pirangaIH#H# or#G#end.n%mero#betFeen#1#and#100#H

Passando para Criteria:


;riteria#select#2#sessao.create;riteriaG,ndereco.classH* )tringOP#r%as#2#(3,pitTcio#'essoa3D#3-piranga3/* select.addG# Bestrictions.orG# Bestrictions.betFeenG3n%mero3D#neF#-ntegerG1HD#neF#-ntegerG100H#HD Bestrictions.inG#3r%a3D#r%as##H# ### ###H* ########H

O %digo usando Criteria muito mais longo do (ue a e/press)o em H'L e tambm menos legvel. Pro ure utili.ar Criteria apenas (uando for uma bus a (ue est* sendo montada em tempo de e/e u-)o$ se vo 7 pode prever a bus a$ use 0named (ueries1 e parHmetros para dei/ar o eu %digo mais limpo e mais simples. Outra parte importante das pes(uisas s)o as fun-2es de pes(uisa em &trings. Co 7 pode usar 0L?T"1 e os smbolos 0U1 e 0I1$ do mesmo modo (ue eles s)o utili.ados em &'L. Cejamos um e/emplo:
+rom#;%rso#c#Fhere#c.nome#liCe#S9esen&ol&imentoUI

"m Criteria:
;riteria#select#2#sessao.create;riteriaG;%rso.classH* select.addG#Bestrictions.liCeG3nome3D#39esen&ol&imento3D#>atch>ode.)5EB5H#H*

9lm disso$ vo 7 ainda pode ordenar as suas pes(uisas$ em ordem as endente ou des endente. Como nos e/emplos a seguir:
+rom#El%no#al#order#bA#al.nome#asc

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5L

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

"m Criteria:
;riteria#select#2#sessao.create;riteriaGEl%no.classH* select.add:rderG#:rder.ascG3nome3H#H*

Iniciali a!"o tardia #la $%loading&


=uando voc faz uma pes uisa em uma tabela no banco de dados, no necessariamente pes uisa tamb9m pelas tabelas ue esto relacionadas, por ue voc pode estar carre!ando informaJes ue no so necessrias neste cenrio da sua aplicao. 8 Hibernate tamb9m no inicializa os relacionamentos ,#O e O#O automaticamente, por ue ele pode estar caindo nesse caso de carre!ar ob&etos ue no so necessrios neste caso. 6Cistem dois modos de se definir a inicializao de relacionamentos ,#O e O#O, o primeiro 9 definir o atributo 2o%ter-join3 da associao 4um 0set7, por eCemplo7 para 2true3. 5sso vai fazer com ue a coleo de ob&etos se&a 2sempre3 inicializada completamente antes de devolver o ob&eto. :as isso sK funciona para buscas feitas usando a Briteria AI5, ou os m9todos 2!et473 e 2load473. 8 outro modo 4e mais indicado7 9 fazer uma 2left &oin3 entre os ob&etos, em uma busca H=>, assim voc sK vai carre!ar a coleo uando ela for necessria. "e&amos como fazer isso no nosso modelo, carre!ando as 1isciplinas de um Burso# +rom#;%rso#c%rso le+t#join#+etch#c%rso.disciplinas Fhere#c%rso.nome#2#@nome "e&a ue nKs adicionamos 2left &oin fetc$3 a uer; e depois indicamos a coleo ue deveria ser inicializada, neste caso 2curso.disciplinas3. Assim, uando essa busca for eCecutada, vai retornas os ob&etos Burso com as suas respectivas 1isciplinas intRnciadas.

%oncluso
O Hibernate um framewor, in rvel$ (ue fa ilita o desenvolvimento de apli a-2es (ue a essam ban os de dados$ fa.endo om (ue o programador se preo upe mais om o seu modelo de objeto e seus omportamentos$ do (ue om as tabelas do ban o de dados. O Hibernate tambm evita o trabalho de es rever dE.ias de %digo repetido para fa.er as mesmas oisas$ omo 0inserts1$ 0sele ts1$ 0updates1 e 0deletes1 no ban o de dados$ alm de ter duas op-2es para se montar bus as omple/as em grafos de objetos e ainda uma sada para o aso de nada fun ionar$ usar &'L. 9lm de me anismo de mapeamento objeto/rela ional$ o Hibernate tambm pode trabalhar om um sistema de a he das informa-2es do ban o de dados$ aumentando ainda mais a performan e das apli a-2es. O es(uema de a he do Hibernate omple/o e totalmente e/tensvel$ e/istindo diversas implementa-2es possveis$ ada uma om suas pr%prias ara tersti as. " junto om isso$ ele tambm tem um geren iador de vers2es pr%prio. "ntretanto$ omo j* foi dito no in io do artigo$ ele n)o a solu-)o perfeita para todos os problemas$ apli a-2es (ue fa.em uso intenso de stored pro edures$ triggers$ user defined fun tions e outras e/tens2es espe fi as dos ban os de dados$ normalmente n)o v)o se benefi iar do me anismo ofere ido pelo Hibernate. 9lm disso$ apli a-2es (ue tem uma alta fre(S7n ia de 0movimentos em massa1$ omo se(S7n ias de 0inserts1$ 0updates1 e 0deletes1 terminaria por perder performan e$ gra-as a instan ia-)o e arregamento de diversos objetos na mem%ria. "ste artigo apenas um aperitivo para o (ue o Hibernate pode realmente fa.er por vo 7$ onsulte a refer7n ia ofi ial$ leia os !ava;o s e$ se puder$ ompre o livro do 3avin Ting e do Christian Bauer$ Hibernate em 9-)o =originalmente 0Hibernate in 9 tion1>$ um adendo valioso a sua bibliote a$ n)o apenas pelo onteEdo rela ionado ao Hibernate$ mas pelas boas pr*ti as de desenvolvimento e ar(uitetura de sistemas.

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5M

Comunidade Livre Paraba


http://www.softwarelivre.pb.gov.br/

Maurcio Linhares =mauri io.linharesVgmail. om> estudante de ;esenvovimento de &oftware para a ?nternet no C"J":APB$ de Comuni a-)o &o ial = om habilita-)o em !ornalismo> na #JPB e membro do grupo Comunidade Livre Paraba =http://www.softwarelivre.pb.gov.br/>.

'eferncias e recursos
Hibernate 5n Action. Aauer, B$ristian. Sin!, Tavin. 6ditora :annin!, -00* Hibernate# A 1eveloperUs Ooteboo/. 6lliot, @ames. 6ditora 8UDeill;, -00* 1ocumentao do Hibernate 3, vrios autores. 1b1esi!ner 4ferramenta de criao de bancos de dados :;<=>7 @ude 4ferramenta de modela!em ?:> @ava7

3rupo de #su*rios !ava 4 http://www.guj. om.br 4 P*gina 5N

Você também pode gostar