Escolar Documentos
Profissional Documentos
Cultura Documentos
Intruducao Hibernate3 Guj
Intruducao Hibernate3 Guj
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.
"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.
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
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.
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.
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
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
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
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.
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
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
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.
%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
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
!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
&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.
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*
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
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
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
"m Criteria:
;riteria#select#2#sessao.create;riteriaGEl%no.classH* select.add:rderG#:rder.ascG3nome3H#H*
%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.
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