You are on page 1of 22

Persistncia com EJB 3.

A API de Persistncia Java (JPA)


Enterprise Java Beans foram por muito tempo o patinho feio da especificao JEE. Muitos desenvolvedores j descobriram funcionalidades poderosas como Session Beans, Message riven Beans e !imeServices, entretanto a comple"idade de uso de tais recursos aliado # defici$ncia dos servios de persist$ncia dificultaram a adoo da tecnologia e impulsionaram o uso de solu%es alternativas como o &ibernate e o 'racle !op(in). * boa not+cia , -ue a especificao EJB ../, mais simples e turbinada, pretende colocar os pol$micos Enterprise Java Beans novamente em foco, mas desta ve0, como atores principais e no meros coadjuvantes. * finalidade do EJB ../ , melhorar a ar-uitetura EJB redu0indo a sua comple"idade do ponto de vista dos desenvolvedores. * especificao EJB ../ foi definida pela JS1233/ 4Enterprise JavaBeans, 5ersion ../6, finali0ada em 77 de maio de 3//8. 9arte dessa especificao , a nova *9: de persist$ncia Java 4J9*6. Esta *9: de persist$ncia , o novo padro para solu%es de mapeamento objeto2relacional em Java. Este artigo vai e"plorar os fundamentos desta nova *9: e fornecer e"emplos prticos de c;digos -ue serviro como ferramentas para ajudar os desenvolvedores a comearem rapidamente a utili0ar esta *9:. O que a persistncia em EJB 3.0 * persist$ncia EJB ../ utili0a o mapeamento objeto2relacional para minimi0ar o <gap= e"istente entre o nosso modelo orientado a objetos e o banco de dados relacional. *s aplica%es escritas usando a *9: de persist$ncia Java devem ser portveis para muitas bases de dados relacionais. * implementao da J9* , feita por um <provider= de persist$ncia. Esse <provider= define como as coisas funcionam atrav,s da implementao de todas as interfaces definidas pela especificao da J9*. >om isso, podem e"istir vrias implementa%es da J9*. *l,m de ser portvel entre bases de dados relacionais, uma aplicao bem projetada em EJB ../ deve ser portvel tamb,m em termos do <provider= de persist$ncia. Essa portabilidade significa -ue a aplicao dever funcionar com implementa%es de <providers= de fabricantes distintos, -ue estejam em conformidade com a JS1233/, sem nenhum esforo adicional. Enterprise Java Beans foram tradicionalmente associados com containers pesados como JBoss, ?ebsphere, ?eb(ogic e outros. Estes containers fornecem muitos servios para as aplica%es distribu+das, por,m eles no so necessariamente parte de uma aplicao EJB ../. 9ara muitas aplica%es, este cenrio de distribuio pode ainda fa0er sentido, entretanto, a *9: de 9ersist$ncia Java , especificamente projetada para ser usada com ou sem um container. Em particular, o <provider= de persist$ncia , necessrio pela especificao para trabalhar fora do <container=. Os requisitos 9ara comear a trabalhar com a persist$ncia em EJB ../ precisamos de alguns itens instalados@ 9rovider de persist$ncia EJB ../A Banco de dados relacionalA river J B>. 's e"emplos apresentados nesse artigo devem trabalhar com muitas combina%es das ferramentas apresentadas na lista anterior. 1ecordando -ue um dos grandes benef+cios de utili0armos os padr%es especificados , -ue voc$ no est amarrado a um fornecedor. ' &ibernate , o frameBor) livre e de c;digo aberto mais popular -ue implementa a J9*. 's e"emplos apresentados a-ui foram desenvolvidos usando o &ibernate ..3./ em conjunto com o &ibernate EntitC Manager ..3./. !odos os c;digos apresentados neste artigo devem funcionar com essas vers%es de &ibernate ou -ual-uer outra implementao, de outro fabricante, -ue esteja em conformidade com a JS1233/.

(embre2se de -ue a JS1233/ , apenas uma especificao e podem e"istir vrias implementa%es desta especificao. O Entity ana!er ' EntityManager no EJB ../ , responsvel por consultar e gerenciar as entidades persistentes conhecidas como Entidades. ' EntityManager , o in+cio da maioria das opera%es de persist$ncia. * t,cnica para recuperar um EntityManager em um ambiente Java EE , ligeiramente diferente da t,cnica para recuperar um EntityManager em um ambiente Java SE. 9or simplicidade, os e"emplos a-ui apresentados esto focados no ambiente Java SE, assim, nenhum container precisa ser configurado. Da (istagem 7 temos o trecho de c;digo referente # criao do EntitCManager a partir de uma EntitCManager EactorC em um ambiente Java SE. "ista!em #. >riao do EntitCManager. import java".persistence.EntitCManagerA import java".persistence.EntitCManagerEactorCA import java".persistence.9ersistenceA ... EntitCManagerEactorC emf F 9ersistence.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A 9ara -ue uma entidade se torne persistente , necessrio associ2la a um contexto de persistncia, -ue fornece a cone"o entre as instHncias e o banco de dados. * manipulao destas instHncias , feita, a partir desse conte"to, por meio do gerenciador de entidades 4EntityManager6. ' gerenciador de entidades na J9* , uma instHncia da interface javax.persistence.EntityManager. ' primeiro parHmetro do m,todo createEntityManagerFactory , o nome do conte"to persistente. Este conte"to de persist$ncia precisa ser configurado no ar-uivo persistence."ml. Este ar-uivo de configurao precisa estar locali0ado no diret;rio IME!*2:DE ou em algum ar-uivo <.jar= -ue esteja no seu >(*SS9*!&. Se o ar-uivo de configurao no estiver em um ar-uivo <.jar=, tenha cuidado como o >(*SS9*!& , configurado. ' ar-uivo de configurao precisa ser carregado como um recurso chamado ME!*2:DEIpersistence."ml, ento se o ar-uivo est em IlocalIdevIstuffIME!*2:DEIpersistence."ml precisamos ter o caminho IlocalIdevIstuffI no >(*SS9*!&, e no IlocalIdevIstuffIME!*2:DEI. Da (istagem 3 , apresentado o e"emplo de um descritor de conte"to de persist$ncia. "ista!em $. escritor do conte"to de persist$ncia.

org.hibernate.ejb.&ibernate9ersistence com.persistencedemo.9essoa com.persistencedemo.Empregado com.persistencedemo.'utra>lasse

Da "ista!em $, o nome da unidade de persist$ncia 46 , um r;tulo arbitrrio, voc$ escolhe um nome e este nome ser utili0ado mais tarde para fa0er refer$ncia a esse conte"to de persist$ncia. ' descritor pode conter uma ou vrias unidades de persist$ncia, e cada uma deve ter um nome. Este nome , o primeiro argumento para o m,todo Persistence.createEntityManagerFactory do c;digo java apresentado anteriormente. Se o descritor contiver mais de uma unidade de persist$ncia, cada uma deve ser configurada com seus pr;prios parHmetros. ' nome passado para o m,todoPersistence.createEntityManagerFactory utili0a o mecanismo de persist$ncia desta configurao passada. ' elemento define o nome do provedor de persist$ncia. Este nome , um nome espec+fico e dependente do fornecedor do provider. Do nosso caso, org.hibernate.ejb.HibernatePersistence , o nome do provedor do &ibernate. ' ar-uivo descritor cont,m ainda o elemento para cada tipo de entidade associada com sua unidade de persist$ncia. *s entidades sero descritas com mais detalhes mais adiante. >omo pode ser visto na "ista!em $, dentro do elemento e"istem -uantos elementos . Este elemento permite -ue propriedades arbitrrias sejam atribu+das e passadas para o provedor de persist$ncia. Estas propriedades so normalmente configura%es espec+ficas do fornecedor da classe do provedor. ' ar-uivo descritor , o Jnico lugar onde veremos detalhes sobre -ual-uer implementao particular da J9*. !odo o c;digo da aplicao mostrado a seguir , independente de fornecedor, e por isso um padro. D;s usaremos &ibernate e MCSK(. Entidades >omo se sabe, e"istem -uatro tipos de EJBs 4ler %ota #6@ Stateless Session Beans, Statef l Session Beans, Entity Beans e Message!driven BeansA e a especificao EJB ../ trou"e algumas mudanas para cada tipo de EJB. Estamos interessados a-ui apenas nos EJBs do tipo Entity Beans. Entidades so instHncias -ue podem ser arma0enadas e recuperadas usando a *9: J9*. Lma entidade , -uase um Plain "ld Java "bject 49'J'6 4ler %ota $6. 's re-uisitos para ser considerado uma Entidade 4Entity Bean6 so@ 9recisa possuir um construtor sem argumentosA Do possuir nenhum m,todo finalA * classe no pode ser final# 9recisa ser marcada com MEntity 4ou ter um descritor NM( apropriado6. %ota #. &ipos EJB >ada um dos outros tipos de EJBs possuem caracter+sticas espec+ficas -ue no entraremos em detalhe nesse artigo, mas como e"emplo@ Stateless Session Beans precisam ter a anotao 4ler%ota 36 MStateless, j os do tipo Statef l Session Beans precisam da anotao MStateful e os do tipo Message!driven Beans precisam da anotao MMessage riven. %ota $. POJO 9'J', um acrOnimo para 9lain 'ld Java 'bjects, define um objeto -ue no possui nenhuma caracter+stica especial. Lm 9'J' , um objeto Java normal -ue no implementa nenhuma interface nem estende nenhuma classe espec+fica de um frameBor). POJO Da "ista!em 3 , apresentado um 9'J' simples -ue poderemos arma0enar utili0ando o padro de persist$ncia EJB .. "ista!em 3. Dosso primeiro e"emplo de um 9'J'. pac)age com.persistencedemoA public class 9essoa P

private String nomeA private String sobrenomeA public 9essoa46 P Q public 9essoa4String nome, String sobrenome6 P this.nome F nomeA this.sobrenome F sobrenomeA Q public String getDome46 P return nomeA Q public void setDome4String nome6 P this.nome F nomeA Q public String getSobrenome46 P return sobrenomeA Q public void setSobrenome4String sobrenome6 P this.sobrenome F sobrenomeA Q public String toString46 P return sobrenome R G, G R nomeA Q

%ota 3. Anota'(es * persist$ncia em EJB . tira vantagem das anota%es do Java S. * persist$ncia EJB . no re-uer a e"ist$ncia do Java S. !udo -ue podemos fa0er atrav,s de anota%es podemos tamb,m fa0er usando um descritor NM(. Dossos e"emplos esto baseados na soluo com anota%es por serem mais claras e simples. Esta classe define dois campos -ue representam uma 9essoa 4nome e sobrenome6 junto com alguns m,todos padr%es para atribuir e recuperar esses valores. *ntes de podermos arma0enar um objeto 9essoa no banco de dados, temos apenas duas pe-uenas mudanas para fa0er na classe 9essoa. 9rimeiro, precisamos marcar a classe com )Entity, de acordo com a "ista!em *. "ista!em *. :ncluso da anotao MEntitC no nosso 9'J' para possibilitar sua persist$ncia. pac)age com.persistencedemoA import java".persistence.EntitCA )Entity public class 9essoa P ... Q

Em seguida, precisamos adicionar um campo <id= na classe. Embora isso no seja estritamente re-uerido, na prtica voc$ ter um campo identificador na maioria das suas entidades. Este campo <id= , o -ue usaremos para representar a identidade no banco de dados. Se tentarmos usar <Sobrenome= ou mesmo <Dome R Sobrenome= para a identidade, no poderemos arma0enar duas pessoas como mesmo nome no banco de dados. :sto seria um problema em muitas situa%es. *lgumas ve0es seu modelo de objetos j cont,m alguma coisa -ue representa a identificao Jnica. Kuando esse no for o caso, , bom adicionarmos o <id= como identificao Jnica conforme mostrado na "ista!em +. "ista!em +. Dossa Entidade de 9ersist$ncia EJB .. pac)age com.persistencedemoA import java".persistence.EntitCA import java".persistence.Tenerated5alueA import java".persistence.:dA )Entity public class 9essoa P private String nomeA private String sobrenomeA private :nteger idA II novo campo para representar a identidade Jnica U public void setSobrenome4String sobrenome6 P this.sobrenome F sobrenomeA Q )Id ),enerated-a.ue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String toString46 P return sobrenome R G, G R nomeA Q Q ' m,todo <get:d= tem duas anota%es distintas. * anotao )Id informa para o provedor de persist$ncia -ue esta propriedade deve ser usada para representar a identidade do objeto no banco de dados. * anotao ),enerated-a.ue informa -ue a aplicao no ir associar valor para este campo e -ue este ser gerado automaticamente. Se o campo <id= fosse algo como um nJmero de cpf ou matr+cula do empregado, e voc$ no -uisesse -ue ele fosse gerado automaticamente, esta anotao no teria -ue ser feita. ' c;digo mostrado na "ista!em + , um e"emplo completo de uma Entidade de 9ersist$ncia EJB .. :nstHncias da classe 9essoa agora podem ser arma0enadas no banco de dados passando2as para o m,todo persist$% da classe EntitCManager.

iferentemente de J ' 4Java ata 'bjects6 e outras vers%es anteriores de &ibernate, no , necessrio um ar-uivo descritor em NM(. /a.vando entidades * forma de salvar uma Entidade, como objetos do tipo 9essoa, , passar a Entidade a ser persistida para o m,todo persist$% de um EntitCManager. Kuando as entidades esto sendo inseridas, e"clu+das ou -uando as entidades so recuperadas para serem modificadas na base de dados, estas opera%es precisam acontecer dentro do conte"to de uma transao de 9ersist$ncia EJB ., -ue , conhecida como Entity&ransaction. ' c;digo da "ista!em 0 mostra como recuperar e interagir com uma Entity&ransaction. Este e"emplo apenas reali0a o <co''it= na transao ap;s persistir uma 9essoa. "ista!em 0. E"emplo simples de como persistir a nossa entidade de persist$ncia EJB .. import java".persistence.EntitCManagerA import java".persistence.EntitCManagerEactorCA import java".persistence.EntitC!ransactionA import java".persistence.9ersistenceA public class Save9essoa P public static void main4StringVW args6 P EntitCManagerEactorC emf F 9ersistence.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A EntitC!ransaction t" F em.get!ransaction46A t".begin46A em.persist4neB 9essoa4GBenG, GEran)linG66A t".commit46A em.close46A Q Q * primeira ve0 -ue o c;digo da "ista!em 0 , e"ecutado, uma nova tabela ser criada para arma0enar os objetos 9essoa, isso se a tabela no e"istir. E"iste uma propriedade espec+fica do &ibernate -ue est sendo informada no nosso ar-uivo de configurao do conte"to de persist$ncia 4persistence."ml6, apresentado na "ista!em 1, -ue fa0 com -ue isso acontea. Dote no ar-uivo a propriedade hibernate.hb'(ddl.a to -ue est com o valor <update=. Esta propriedade di0 para o &ibernate criar automaticamente a tabela se ela no e"istir. "ista!em 1. escritor de conte"to de persist$ncia. org.hibernate.ejb.&ibernate9ersistence com.persistencedemo.9essoa

9or defa lt) o nome da tabela ser o mesmo da classe, e uma coluna ser adicionada na tabela para representar cada campo persistente da nossa classe. Da 2i!ura #, vemos a tabela -ue ser gerada pelo &ibernate para a classe 9essoa.

2i!ura #. Es-uema da tabela pessoa. E"istem muitos detalhes espec+ficos sobre o mapeamento objeto2relacional -ue voc$ pode ter total controle usando anota%es do padro EJB .. 9or e"emplo, se desejarmos arma0enar objetos da classe 9essoa em uma tabela chamada <populacao=, ao inv,s da tabela se chamar <pessoa=, uma anotao )&a3.e(name45popu.acao5) precisa ser adicionada para a classe 9essoa conforme pode ser visto na "ista!em 6. "ista!em 6. :ncluso da anotao -ue especifica a tabela onde ser reali0ada a persist$ncia. pac)age com.persistencedemoA import import import import java".persistence.EntitCA java".persistence.Tenerated5alueA java".persistence.:dA java".persistence.!ableA

MEntitC )&a3.e(name47popu.acao7) public class 9essoa P Q ...

'utro e"emplo de controle sobre o mapeamento objeto2relacional , ajustar os tamanhos das colunas usadas para arma0enar Dome e Sobrenome. Dote na 2i!ura # -ue estas colunas esto com tamanho defa lt 43SS caracteres6. Se -uisermos diminuir para .S caracteres, conforme 2i!ura $, ento anota%es )8o.umn("en!t943+) precisam ser adicionadas em cada uma das propriedades conforme podemos verificar na "ista!em :. 2i!ura $. Es-uema da tabela populao com os tamanhos alterados.

"ista!em :. :ncluso da anotao -ue indica o tamanho da coluna na tabela. pac)age com.persistencedemoA import java".persistence.>olumnA import java".persistence.EntitCA import java".persistence.!ableA MEntitC M!able4nameFGpopulacaoG6 public class 9essoa P ... )8o.umn(.en!t943+)

public String getDome46 P return nomeA Q )8o.umn(.en!t943+) public String getSobrenome46 P return sobrenomeA Q

*gora, -uando o &ibernate criar a tabela, ele usar os valores representados nas anota%es. Se a tabela j e"istir, ela no ser e"clu+da e, portanto, no alterar os valores j e"istentes e utili0ados -uando da criao da tabela. 9or,m, -uando o &ibernate recriar a tabela, ela ser recriada com os novos tamanhos definidos. :sso acontece se e"cluirmos a tabela e"plicitamente do banco de dados e ela no mais e"istir, ou se alterarmos a propriedade hibernate.hb'(ddl.a to para o valor <create= ou <create2drop=. 8onsu.tando entidades >onsultar as Entidades no banco de dados pode ser to simples -uanto arma0en2 las. Lma ve0 -ue um EntitCManager foi criado, uma entidade pode ser recuperada a partir deste EntitCManager e"ecutando m,todos de consultas. Da "ista!em #0 , apresentado um e"emplo simples de c;digo -ue recupera todas as instHncias de 9essoa do nosso banco de dados. "ista!em #0. >;digo -ue recupera todas as instHncias da classe 9essoa do nosso banco de dados. pac)age com.persistencedemoA import java.util.(istA import import import import java".persistence.EntitCManagerA java".persistence.EntitCManagerEactorCA java".persistence.9ersistenceA java".persistence.KuerCA

public class 1ead9opulacao P public static void main4StringVW args6 P EntitCManagerEactorC emf F 9ersistence.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A II recupera todas as entidades 9essoas... KuerC -uerC F em.createKuerC4Gfrom 9essoaG6A (ist results F -uerC.get1esult(ist46A for 49essoa p @ results6 P SCstem.out.println4p6A Q

Q Q

* consulta e"ecutada para retornar a lista de pessoas cadastradas ,@ <from 9essoa=. *-ui vale observar -ue a classe 9essoa possui uma anotao informando -ue o nome da tabela , <populao= e no <pessoa=, conforme "ista!em 6. Entretanto, a consulta , feita referenciando o nome <9essoa=, isso mostra -ue a consulta fa0 refer$ncia ao nome da classe e no ao nome da tabela.

* consulta anterior recupera todas as instHncias de 9essoa a partir do banco de dados. Esta nossa consulta pode ser parametri0ada para reali0ar uma consulta mais espec+fica. ' c;digo da "ista!em ## recupera somente as instHncias de 9essoas onde o <sobrenome= , <9into=. "ista!em ##. >;digo -ue parametri0a a consulta ao nosso banco de dados. ... II recupera todas as 9essoas com sobrenome F G9intoG String -rCString F Gfrom 9essoa Bhere sobrenome F @sobrenome9aramGA KuerC -uerC F em.createKuerC4-rCString6A -uerC.set9arameter4Gsobrenome9aramG, G9intoG6A (ist results F -uerC.get1esult(ist46A ... Da nossa consulta, a string <sobrenome= se refere a um atributo da classe 9essoa. Dote -ue o nome da coluna no banco de dados no , necessariamente o mesmo nome do atributo da classe. ' to*en<sobreno'ePara'= representa um parHmetro na consulta -ue precisa ser povoado antes -ue a consulta seja e"ecutada. ' parHmetro , povoado atrav,s do m,todo <setPara'eter= onde o primeiro argumento , uma string -ue corresponde ao to*en da consulta, e o segundo argumento , o valor -ue ser atribu+do no lugar do to*en. Da consulta, o to*en , precedido por <@= 4dois pontos6, -ue , omitido na chamada do m,todo <setPara'eter=. Lma consulta pode ter -ual-uer nJmero de parHmetros. ;e.acionamento entre as Entidades 's e"emplos utili0ados at, agora demonstraram os procedimentos fundamentais de arma0enamento e recuperao de entidades a partir do banco de dados. * classe 9essoa est isolada sem nenhum relacionamento com outras entidades. *rma0enar grafos comple"os de entidades no , to mais complicado do -ue vimos at, agora. 5amos e"plorar agora um modelo de objetos ligeiramente mais comple"o. >onsidere uma classe <>arro= e uma classe <Motor= onde o relacionamento entre as duas , um para um. !odo carro tem e"atamente um motor e um motor no pode pertencer a mais de um carro. *s classes <>arro= e <Motor= so definidas de acordo com a "ista!em #$. "ista!em #$. >;digo -ue representa os 9'J's >arro e Motor. pac)age com.persistencedemoA import import import import import java".persistence.>ascade!CpeA java".persistence.EntitCA java".persistence.Tenerated5alueA java".persistence.:dA java".persistence.'ne!o'neA

MEntitC public class >arro P private private private private String fabricanteA String modeloA Motor motorA :nteger idA

public >arro46 P this4null, null, null6A Q public >arro4String fabricante, String modelo, Engine motor6 P

this.fabricante F fabricanteA this.modelo F modeloA this.motor F motorA Q M'ne!o'ne4cascade F >ascade!Cpe.9E1S:S!6 public Motor getMotor46 P return motorA Q public void setMotor4Motor motor6 P this.motor F motorA Q public String getEabricante46 P return fabricanteA Q public void setEabricante4String fabricante6 P this.fabricante F fabricanteA Q public String getModelo46 P return modeloA Q public void setModelo4String modelo6 P this.modelo F modeloA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String toString46 P return fabricante R G G R modeloA Q Q pac)age com.persistencedemoA import java".persistence.EntitCA import java".persistence.Tenerated5alueA import java".persistence.:dA MEntitC public class Motor P private :nteger idA private int cilindrosA

private int cm>ubicosA private String fabricanteA public Motor46 P Q public Motor4int cilindros, int cm>ubicos, String fabricante6 P this.cilindros F cilindrosA this.cm>ubicos F cm>ubicosA this.fabricante F fabricanteA Q public int get>m>ubicos46 P return cm>ubicosA Q public void set>m>ubicos4int cm>ubicos6 P this.cm>ubicos F cm>ubicosA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String getEabricante46 P return fabricanteA Q public void setEabricante4String fabricante6 P this.fabricante F fabricanteA Q public int get>ilindros46 P return cilindrosA Q public void set>ilindros4int cilindros6 P this.cilindros F cilindrosA Q Q 5eja -ue o m,todo getMotor na classe >arro est com a anotao )One&oOne, indicando para o mecanismo de persist$ncia -ue o relacionamento entre o >arro e seu Motor , um relacionamento um2para2um. >omplementando a representao da cardinalidade, o trecho <cascade 4 8ascade&ype.PE;/I/&= indica ao mecanismo de persist$ncia -ue este deve automaticamente persistir a propriedade Motor -uando um >arro , persistido. Sem esta informao, o Motor teria -ue ser

e"plicitamente persistido. ' c;digo da "ista!em #3 cria alguns >arros e Motores e os salva no banco de dados. "ista!em #3. >;digo -ue cria alguns carros e motores e os persiste atrav,s do EntitCManager. EntitCManagerEactorC emf F 9ersistence .createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A EntitC!ransaction t" F em.get!ransaction46A t".begin46A Motor motor7 F neB Motor4X, .S/, G!ritonG6A >arro carro7 F neB >arro4GEordG, GE27S/G, motor76A Motor motor3 F neB Motor48, 3X/, GTMG6A >arro carro3 F neB >arro4G>hevroletG, G>orsaG, motor36A II os Motores sero automaticamente arma0enados por-ue II os >arros os fa0em refer$ncias... em.persist4carro76A em.persist4carro36A t".commit46A em.close46A *ntes de e"ecutar o c;digo temos -ue atuali0ar o ar-uivo <persistence.x'l= com os elementos de classe 46 apropriados conforme a "ista!em #*. "ista!em #*. *lterao do nosso conte"to de persist$ncia para incluso das classes de interesse. org.hibernate.ejb.&ibernate9ersistence com.persistencedemo.>arro com.persistencedemo.Motor ... ' es-uema padro gerado para este modelo de objeto , algo conforme a 2i!ura 3.

2i!ura 3. 1elacionamento um2para2um entre carro e motor. :nstHncias de >arros podem ser recuperadas usando a mesma t,cnica -ue vimos para recuperar as instHncias de 9essoas 4"ista!em #+6. 'bserve -ue no e"iste

nenhuma necessidade de informar -ual-uer coisa sobre a classe Motor na nossa consulta, eles so recuperados sem problemas. "ista!em #+. 1ecuperao das informa%es do banco de dados, a recuperao de Motor , transparente. KuerC -uerC F em.createKuerC4Gfrom >arroG6A (ist results F -uerC.get1esult(ist46A for 4>arro c @ results6 P SCstem.out.println4G>arro@ G R c6A Motor e F c.getMotor46A SCstem.out.println4GDJmero de cilindros@ G R e.get>ilindros466A Q %ave!ando pe.os re.acionamentos 9odemos navegar entre os relacionamentos das entidades para restringir os resultados baseando2se em algumas propriedades -ue so propagadas no nosso grafo de objetos. 9or e"emplo, na "ista!em #0 carros podem ser consultados atrav,s do nJmero de cilindros de seu Motor. 9ara isso, primeiro definimos a consulta -ue -ueremos reali0ar e a parametri0amos utili0ando o parHmetro <numcilindros=. *tribu+mos ao parHmetro o valor X 4oito6 atrav,s do m,todo set9arameter, e em seguida a consulta , e"ecutada retornando o resultado esperado. ' detalhe da navegao est na nossa consulta <from >arro Bhere motor.cilindros F @numcilindros=. 9erceba -ue estamos recuperando instHncias da classe >arro fa0endo refer$ncia a uma propriedade da classe motor na pr;pria consulta. * navegao entre as classes e tabelas fica transparente. "ista!em #0. 1ecuperando os carros -ue so X cilindros. String -rCString F Gfrom >arro Bhere motor.cilindros F @numcilindrosGA KuerC -uerC F em.createKuerC4-rCString6A II recupera somente os carros com motores de X cilindros... -uerC.set9arameter4Gnumcilindros G, X6A (ist results F -uerC.get1esult(ist46A for 4>arro p @ results6 P SCstem.out.println4p6A Q ;e.acionamento <m=para= uitos 9ara representar um relacionamento um2para2muitos devemos utili0ar a anotao )One&o any. Esta , aplicada na propriedade -ue representa a coleo no lado -ue possui o relacionamento. >onsidere um relacionamento entre um > de mJsica e todas as fai"as contidas neste > 4ver"ista!em #1). "ista!em #1. E"emplo de c;digo para relacionamento Lm2para2Muitos. pac)age com.persistencedemoA import java.util.*rraC(istA import java.util.(istA import import import import import java".persistence.>ascade!CpeA java".persistence.EntitCA java".persistence.Tenerated5alueA java".persistence.:dA java".persistence.'ne!oManCA P

MEntitC public class >

private String artistaA private String tituloA

private (ist fai"as F neB *rraC(ist46A private :nteger idA public > 46 P Q public > 4String artista, String titulo6 P this.artista F artistaA this.titulo F tituloA Q public void addEai"a4Eai"a fai"a6 P fai"as.add4fai"a6A Q public String get*rtista46 P return artistaA Q public void set*rtista4String artista6 P this.artista F artistaA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String get!itulo46 P return tituloA Q public void set!itulo4String titulo6 P this.titulo F tituloA Q )One&o any(cascade 4 > 8ascade&ype.PE;/I/& ?) public (ist getEai"as46 P return fai"asA Q public void setEai"as4(ist fai"as6 P this.fai"as F fai"asA Q public String toString46 P return tituloA Q Q pac)age com.persistencedemoA

import java".persistence.EntitCA import java".persistence.Tenerated5alueA import java".persistence.:dA MEntitC public class Eai"a P private int duraaoA private String tituloA private :nteger idA public Eai"a46 P Q public Eai"a4int duracao, String titulo6 P this.durao F duracaoA this.titulo F tituloA Q public int get uracao 46 P return duracaoA Q public void set uracao4int duracao6 P this.duracao F duracaoA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String get!itulo46 P return tituloA Q public void set!itulo4String titulo6 P this.titulo F tituloA Q

' es-uema padro gerado para o relacionamento um2para2muitos pode ser visto na 2i!ura *.

2i!ura *. 1elacionamento um2para2muitos. Da "ista!em #6 vemos como , o procedimento para persistir novos > s e suas fai"as. 9erceba -ue o mecanismo para persistir as instHncias da classe > , muito parecido com o -ue utili0amos para persistir instHncias de >arros na "ista!em #3. "ista!em #6. >;digo -ue cria alguns >ds e suas fai"as e os persiste atrav,s do EntitCManager. EntitCManagerEactorC emf F 9ersistence.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A EntitC!ransaction t" F em.get!ransaction46A t".begin46A > cd F neB > 4G!he BeatlesG, G1ubber SoulG6A cd.addEai"a4neB Eai"a433/, GDorBegian ?oodG66A cd.addEai"a4neB Eai"a47X/, G rive MC >arG66A em.persist4cd6A cd F neB > 4G eep 9urpleG, GMachine &eadG6A cd.addEai"a4neB Eai"a43//, GSmo)e 'n !he ?aterG66A cd.addEai"a4neB Eai"a4YX/, G(a0CG66A em.persist4cd6A t".commit46A em.close46A Davegar no relacionamento entre um > e suas Eai"as apresenta uma sinta"e ligeiramente diferente da -ue , utili0ada para navegar no relacionamento um2para2 um. Essa diferena , observada na consulta da "ista!em #:, onde temos -ue a palavra <in= significa -ue Gfai"asG , uma coleo de instHncias relacionadas, e a e"presso <cd.fai"as= -ue navega de uma instHncia de > para suas fai"as relacionadas. "ista!em #:. 1ecuperando os > s -ue cont,m a fai"a <(a0C=. String -rCString F Gselect cd from > as cd, in 4cd.fai"as6 fai"a Bhere fai"a.titulo F @tituloEai"aGA KuerC -uerC F em.createKuerC4-rCString6A II recupera todos os >ds -ue contem a fai"a G(a0CG -uerC.set9arameter4GtituloEai"aG, G(a0CG6A (ist results F -uerC.get1esult(ist46A for 4> c @ results6 P SCstem.out.println4c6A

Q * string <cd= em minJsculo -ue aparece em vrios lugares no c;digo acima , um alias -ue pode ser -ual-uer coisa. Este alias no precisa ser igual ao nome da classe, mas no nosso caso isto acontece. * consulta apresentada na "ista!em #: pode ser dividida em alguns pedaos para um melhor entendimento. <select cd from > as cd=@ significa -ue estamos consultando > s e referenciando estes > s com o alias <cd=A <in 4cd.fai"as6 fai"a=@ est associando o nome <fai"a= para cada elemento da coleo <cd.fai"as=A <Bhere fai"a.titulo F @tituloEai"a=@ restringe apenas os casos onde cd.fai"as cont,m uma fai"a com o nome -ue seja igual ao valor do parHmetro <tituloEai"a= -ue , povoado em seguida com a chamada do m,todo set9arameter. apeando re.acionamentos de 9eran'a Lm dos aspectos mais desafiadores no mapeamento objeto2relacional , a manipulao de relacionamentos de herana. :dealmente, os desenvolvedores devem definir seus relacionamentos de objetos sem ter compromisso como os objetos sero arma0enados no banco de dados. >ertamente a J9* nos fornece bastante fle"ibilidade -uanto a isso. >onsidere um modelo de objetos composto por 5e+culo, >arro e Bicicleta. 5e+culo , a classe pai de >arro e Bicicleta. * classe 5e+culo cont,m um atributo representando o nJmero de pneus -ue um ve+culo tem. * classe >arro tem fabricante, modelo e motor como atributos. ' atributo motor se refere a um objeto Motor. * classe Bicicleta tem um simples atributo -ue representa o nJmero de marchas -ue a bicicleta tem. 9arte do c;digo destas classes , apresentado na "ista!em $0. "ista!em $0. Mapeamento de herana onde utili0amos a abordagem de uma tabela para cada classe. MEntitC M:nheritance4strategC F :nheritance!Cpe.J':DE 6 public abstract class 5eiculo P private :nteger idA private int num9neusA public 5eiculo4int num9neus6 P this.num9neus F num9neusA Q ... Q MEntitC public class >arro e"tends 5eiculo P private String fabricanteA private String modeloA private Motor motorA public >arro46 P this4null, null, null6A Q public >ar4String fabricante, String modelo, Motor motor6 P

super4Y6A this.fabricante F fabricanteA this.modelo F modeloA this.motor F motorA

... Q MEntitC public class Bicicleta e"tends 5eiculo P private int numMarchasA public Bicicleta46 P this4/6A Q public BicCcle4int numMarchas6 P super436A this.numMarchas F numMarchasA Q ... Q Dote a anotao <)In9eritance(strate!y 4 In9eritance&ype.JOI%E@)= na classe 5eiculo. Esta anotao indica para o mecanismo de persist$ncia -ue o mapeamento da herana deve ser implementado usando jun%es no banco de dados. :sto significa -ue a classe Bicicleta e a classe >arro tero cada uma suas pr;prias tabelas no banco de dados al,m de uma tabela compartilhada -ue cont,m o atributo representando a classe 5eiculo. *s tabelas de carro e de bicicleta se relacionam # tabela de ve+culo usando juno. ' es-uema padro gerado para essas classes seria algo semelhante # 2i!ura +.

2i!ura +. Es-uema gerado para o mapeamento com uma tabela para cada classe. 'utro modo de mapear o mesmo relacionamento , usando uma Jnica tabela. Se as instHncias de >arro e Bicicleta forem arma0enadas juntas em uma mesma tabela, precisamos de alguma coisa na tabela -ue indi-ue -ue tipo de 5eiculo est representado em cada linha. * persist$ncia EJB . utili0a uma coluna com esse prop;sito. Esta coluna simplesmente arma0ena um valor para indicar -ue tipo de objeto est arma0enado em cada linha. * "ista!em $# mostra a anotao re-uerida para mapear nossas tr$s classes usando uma Jnica tabela. "ista!em $#. Mapeamento de herana onde utili0amos a abordagem de uma Jnica tabela para toda a herana. MEntitC M:nheritance4strategC F :nheritance!Cpe.S:DT(EZ!*B(E6 public abstract class 5eiculo P ... Q MEntitC M iscriminator5alue4G>G6 public class >arro e"tends 5eiculo P ... Q MEntitC M iscriminator5alue4GBG6 public class Bicicleta e"tends 5eiculo P

... Q * anotao )@iscriminator-a.ue em >arro e Bicicleta indica para o mecanismo de persist$ncia -ue os valores devem ser usados para representar cada uma das classes na tabela compartilhada. ' es-uema padro para este mapeamento pode ser visto na 2i!ura 0.

2i!ura 0. Es-uema gerado para o mapeamento com tabela Jnica para toda a herana. * coluna ![9E , onde o valor discriminat;rio ser arma0enado. 'utra possibilidade no mapeamento de relacionamentos de heranas , criar uma tabela para cada classe concreta da hierar-uia. Este mapeamento , indicado pela anotao MMappedSuperclass e resulta -ue cada uma das subclasses concretas tem suas pr;prias tabelas, e os atributos -ue so herdados da superclasse so inclu+dos nas tabelas da subclasse, eliminando assim a necessidade de e"istir uma tabela para a superclasse abstrata. Esta alternativa pode ser vista na "ista!em $$. "ista!em $$. Mapeamento da superclasse abstrata nas tabelas da subclasse, no e"iste uma tabela espec+fica para a classe abstrata. MMappedSuperclass public abstract class 5eiculo P ... Q MEntitC public class Bicicleta e"tends 5eiculo P ... Q MEntitC

public class >arro e"tends 5eiculo P ... Q ' es-uema padro gerado para essa escolha de mapeamento , apresentado na 2i!ura 1.

2i!ura 1. Es-uema gerado para o mapeamento com uma tabela para cada classe concreta. Dote -ue o atributo <num9neus= e"iste na tabela bicicleta e na tabela carro. 's desenvolvedores t$m muito controle de como o modelo de objeto ser mapeado para o banco de dados. 's e"emplos simples apresentados anteriormente mostram mudanas significantes para o mapeamento -ue no re-uerem mudanas no modelo de objetos. >ada uma das op%es apresentadas acima usa e"atamente o mesmo modelo de objetos. *s diferenas dos es-uemas so somente os metadados representados pelas anota%es. 8onc.usAo 's e"emplos apresentados neste artigo so apenas o princ+pio da capacidade da especificao de persist$ncia EJB ../. ' objetivo , -ue estas informa%es sirvam como um guia prtico para ajudar aos desenvolvedores comearem a trabalhar com a *9: de persist$ncia Java 4J9*6. * melhor forma de comear com a *9: , instalar um ambiente de desenvolvimento -ue permita a e"ecuo dos e"emplos apresentados neste artigo. 's desenvolvedores iro constatar -ue, comparando com c;digo escrito em J B> ou com outra soluo de mapeamento objeto2 relacional, a *9: de 9ersist$ncia Java 4J9*6 , muito mais direta e fcil de trabalhar. ;eBerncias JS1233/ 2 &ibernate 2

Crcio A.eDandre de O. Pinto 4marcioaopinto+g'ail.co'6 , M.Sc. em Sistemas de :nformao pela Lniversidade Eederal do 1io de Janeiro 4D>EILE1J6, Bacharel em >i$ncia da >omputao pela Lniversidade Eederal do 1io de Janeiro 4LE1J6, possui especiali0ao em *dministrao e !unning de banco de dados pela 9L>21J e MB* em Engenharia de SoftBare pela >Hndido Mendes. *tualmente , *nalista de Sistemas da 9etrobras.

You might also like