Persistência com EJB 3.0 A API de Persistência Java (JPA) Enterprise Java Beans foram por muito tempo o patinho feio da especificação 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 serviços de persist$ncia dificultaram a adoção da tecnologia e impulsionaram o uso de soluç%es alternativas como o &ibernate e o 'racle !op(in). * boa not+cia , -ue a especificação EJB ../, mais simples e turbinada, pretende colocar os pol$micos Enterprise Java Beans novamente em foco, mas desta ve0, como atores principais e não meros coadjuvantes. * finalidade do EJB ../ , melhorar a ar-uitetura EJB redu0indo a sua comple"idade do ponto de vista dos desenvolvedores. * especificação EJB ../ foi definida pela JS1233/ 4Enterprise JavaBeans, 5ersion ../6, finali0ada em 77 de maio de 3//8. 9arte dessa especificação , a nova *9: de persist$ncia Java 4J9*6. Esta *9: de persist$ncia , o novo padrão para soluç%es de mapeamento objeto2relacional em Java. Este artigo vai e"plorar os fundamentos desta nova *9: e fornecerá e"emplos práticos de c;digos -ue servirão como ferramentas para ajudar os desenvolvedores a começarem rapidamente a utili0ar esta *9:. O que é a persistência 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 portáveis para muitas bases de dados relacionais. * implementação da J9* , feita por um <provider= de persist$ncia. Esse <provider= define como as coisas funcionam atrav,s da implementação de todas as interfaces definidas pela especificação da J9*. >om isso, podem e"istir várias implementaç%es da J9*. *l,m de ser portável entre bases de dados relacionais, uma aplicação bem projetada em EJB ../ deve ser portável tamb,m em termos do <provider= de persist$ncia. Essa portabilidade significa -ue a aplicação deverá funcionar com implementaç%es de <providers= de fabricantes distintos, -ue estejam em conformidade com a JS1233/, sem nenhum esforço adicional. Enterprise Java Beans foram tradicionalmente associados com containers pesados como JBoss, ?ebsphere, ?eb(ogic e outros. Estes containers fornecem muitos serviços para as aplicaç%es distribu+das, por,m eles não são necessariamente parte de uma aplicação EJB ../. 9ara muitas aplicaç%es, este cenário de distribuição 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 , necessário pela especificação para trabalhar fora do <container=. Os requisitos 9ara começar 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$ não 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 implementação, de outro fabricante, -ue esteja em conformidade com a JS1233/. (embre2se de -ue a JS1233/ , apenas uma especificação e podem e"istir várias implementaç%es desta especificação. O Entity ana!er ' EntityManager no EJB ../ , responsável 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 estão focados no ambiente Java SE, assim, nenhum container precisa ser configurado. Da (istagem 7 temos o trecho de c;digo referente # criação do EntitCManager a partir de uma EntitCManager EactorC em um ambiente Java SE. "ista!em #. >riação 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 , necessário associá2la a um contexto de persistência, -ue fornece a cone"ão entre as instHncias e o banco de dados. * manipulação 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 configuração 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 configuração não estiver em um ar-uivo <.jar=, tenha cuidado como o >(*SS9*!& , configurado. ' ar-uivo de configuração precisa ser carregado como um recurso chamado ME!*2:DEIpersistence."ml, então se o ar-uivo está em IlocalIdevIstuffIME!*2:DEIpersistence."ml precisamos ter o caminho IlocalIdevIstuffI no >(*SS9*!&, e não 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 já os do tipo Statef l Session Beans precisam da anotação MStateful e os do tipo Message!driven Beans precisam da anotação MMessage riven.persistencedemoA public class 9essoa P .digo da aplicação mostrado a seguir . D. POJO 9'J'. Do nosso caso. o nome da unidade de persist$ncia 46 .hibernate. Entity Beans e Message!driven BeansA e a especificação EJB . e cada uma deve ter um nome.todoPersistence. &ipos EJB >ada um dos outros tipos de EJBs possuem caracter+sticas espec+ficas -ue não entraremos em detalhe nesse artigo.. voc$ escolhe um nome e este nome será utili0ado mais tarde para fa0er refer$ncia a esse conte"to de persist$ncia.ejb. ' elemento define o nome do provedor de persist$ncia.s usaremos &ibernate e MCSK(. Entidades >omo se sabe. ' ar-uivo descritor . %ota #. org. "ista!em 3. Entidades são instHncias -ue podem ser arma0enadas e recuperadas usando a *9: J9*. Este nome . %ota $. Estamos interessados a-ui apenas nos EJBs do tipo Entity Beans. o Jnico lugar onde veremos detalhes sobre -ual-uer implementação particular da J9*. ' nome passado para o m. Este elemento permite -ue propriedades arbitrárias sejam atribu+das e passadas para o provedor de persist$ncia. !odo o c. Statef l Session Beans. e por isso um padrão. pac)age com.digo java apresentado anteriormente. -uase um Plain "ld Java "bject 49'J'6 4ler %ota $6. 's re-uisitos para ser considerado uma Entidade 4Entity Bean6 são@ • 9recisa possuir um construtor sem argumentosA • Dão possuir nenhum m. o nome do provedor do &ibernate. ' descritor pode conter uma ou várias unidades de persist$ncia. dentro do elemento e"istem -uantos elementos . POJO Da "ista!em 3 . e"istem -uatro tipos de EJBs 4ler %ota #6@ Stateless Session Beans.todo finalA • * classe não pode ser final# • 9recisa ser marcada com MEntity 4ou ter um descritor NM( apropriado6. um r.createEntityManagerFactory utili0a o mecanismo de persist$ncia desta configuração passada..prios parHmetros. cada uma deve ser configurada com seus pr.createEntityManagerFactory do c. apresentado um 9'J' simples -ue poderemos arma0enar utili0ando o padrão de persist$ncia EJB . independente de fornecedor.m ainda o elemento para cada tipo de entidade associada com sua unidade de persist$ncia. Estas propriedades são normalmente configuraç%es espec+ficas do fornecedor da classe do provedor. um acrOnimo para 9lain 'ld Java 'bjects. define um objeto -ue não possui nenhuma caracter+stica especial. um objeto Java normal -ue não implementa nenhuma interface nem estende nenhuma classe espec+fica de um frameBor). Se o descritor contiver mais de uma unidade de persist$ncia. ' ar-uivo descritor cont. Lma entidade .HibernatePersistence . *s entidades serão descritas com mais detalhes mais adiante. Este nome . Lm 9'J' .Da "ista!em $. mas como e"emplo@ Stateless Session Beans precisam ter a anotação 4ler%ota 36 MStateless./ trou"e algumas mudanças para cada tipo de EJB.tulo arbitrário. >omo pode ser visto na "ista!em $. Dosso primeiro e"emplo de um 9'J'. o primeiro argumento para o m. um nome espec+fico e dependente do fornecedor do provider.todo Persistence. precisamos marcar a classe com )Entity.nome F nomeA this. Anota'(es * persist$ncia em EJB . 9rimeiro. Q . G R nomeA Q Q %ota 3. *ntes de podermos arma0enar um objeto 9essoa no banco de dados.s de anotaç%es podemos tamb.. String sobrenome6 P this. :nclusão da anotação MEntitC no nosso 9'J' para possibilitar sua persist$ncia. pac)age com. tira vantagem das anotaç%es do Java S. "ista!em *. não re-uer a e"ist$ncia do Java S. * persist$ncia EJB .. Esta classe define dois campos -ue representam uma 9essoa 4nome e sobrenome6 junto com alguns m.persistencedemoA import java".todos padr%es para atribuir e recuperar esses valores. temos apenas duas pe-uenas mudanças para fa0er na classe 9essoa.sobrenome F sobrenomeA Q public String getDome46 P return nomeA Q public void setDome4String nome6 P this.persistence.EntitCA )Entity public class 9essoa P . !udo -ue podemos fa0er atrav.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. Dossos e"emplos estão baseados na solução com anotaç%es por serem mais claras e simples.private String nomeA private String sobrenomeA public 9essoa46 P Q public 9essoa4String nome. de acordo com a "ista!em *.m fa0er usando um descritor NM(. um e"emplo completo de uma Entidade de 9ersist$ncia EJB . na prática voc$ terá um campo identificador na maioria das suas entidades. ' c. * anotação )Id informa para o provedor de persist$ncia -ue esta propriedade deve ser usada para representar a identidade do objeto no banco de dados. Este campo <id= .Em seguida.persistence. Se o campo <id= fosse algo como um nJmero de cpf ou matr+cula do empregado. * anotação ).m alguma coisa -ue representa a identificação Jnica. "ista!em +.ue informa -ue a aplicação não irá associar valor para este campo e -ue este será gerado automaticamente. :sto seria um problema em muitas situaç%es.Tenerated5alueA import java". pac)age com. :nstHncias da classe 9essoa agora podem ser arma0enadas no banco de dados passando2as para o m.persistence.EntitCA import java".ue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.persistencedemoA import java".enerated-a. . . Embora isso não seja estritamente re-uerido. Kuando esse não for o caso.digo mostrado na "ista!em + .: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..persistence. precisamos adicionar um campo <id= na classe. e voc$ não -uisesse -ue ele fosse gerado automaticamente. *lgumas ve0es seu modelo de objetos já cont. não poderemos arma0enar duas pessoas como mesmo nome no banco de dados. Dossa Entidade de 9ersist$ncia EJB .. G R nomeA Q Q ' m. Se tentarmos usar <Sobrenome= ou mesmo <Dome R Sobrenome= para a identidade. esta anotação não teria -ue ser feita. bom adicionarmos o <id= como identificação Jnica conforme mostrado na "ista!em +.todo persist$% da classe EntitCManager.id F idA Q public String toString46 P return sobrenome R G.todo <get:d= tem duas anotaç%es distintas.enerated-a.sobrenome F sobrenomeA Q )Id ). o -ue usaremos para representar a identidade no banco de dados. Esta propriedade di0 para o &ibernate criar automaticamente a tabela se ela não e"istir.createEntitCManager46A EntitC!ransaction t" F em. /a.persistence.EntitCManagerA import java".a to -ue está com o valor <update=.9essoa 9or defa lt) o nome da tabela será o mesmo da classe.persistence. como objetos do tipo 9essoa.persistence.vando entidades * forma de salvar uma Entidade.persist4neB 9essoa4GBenG. estas operaç%es precisam acontecer dentro do conte"to de uma transação de 9ersist$ncia EJB . isso se a tabela não e"istir.digo da "ista!em 0 mostra como recuperar e interagir com uma Entity&ransaction.. org.hibernate. Da 2i!ura #. -ue .commit46A em. Este e"emplo apenas reali0a o <co''it= na transação ap. "ista!em 0. passar a Entidade a ser persistida para o m. apresentado na "ista!em 1. necessário um ar-uivo descritor em NM(.9ersistenceA public class Save9essoa P public static void main4StringVW args6 P EntitCManagerEactorC emf F 9ersistence."ml6. Kuando as entidades estão sendo inseridas.iferentemente de J ' 4Java ata 'bjects6 e outras vers%es anteriores de &ibernate.EntitC!ransactionA import java". ' c. E"iste uma propriedade espec+fica do &ibernate -ue está sendo informada no nosso ar-uivo de configuração do conte"to de persist$ncia 4persistence. -ue fa0 com -ue isso aconteça. e"clu+das ou -uando as entidades são recuperadas para serem modificadas na base de dados. .persistence. conhecida como Entity&ransaction.begin46A em.persistencedemo. import java". não .todo persist$% de um EntitCManager.hb'(ddl.get!ransaction46A t". E"emplo simples de como persistir a nossa entidade de persist$ncia EJB . Dote no ar-uivo a propriedade hibernate. GEran)linG66A t".digo da "ista!em 0 . escritor de conte"to de persist$ncia. vemos a tabela -ue será gerada pelo &ibernate para a classe 9essoa.close46A Q Q * primeira ve0 -ue o c. e uma coluna será adicionada na tabela para representar cada campo persistente da nossa classe.s persistir uma 9essoa.EntitCManagerEactorCA import java". uma nova tabela será criada para arma0enar os objetos 9essoa.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf. .ejb. "ista!em 1. e"ecutado.&ibernate9ersistence com.. persistence. Se -uisermos diminuir para .persistence.e(name45popu..persistence.Tenerated5alueA java".e(name47popu. "ista!em 6. ao inv. pac)age com. conforme 2i!ura $. )8o.persistence.en!t943+) .EntitCA java".acao7) public class 9essoa P Q . ajustar os tamanhos das colunas usadas para arma0enar Dome e Sobrenome.. "ista!em :..persistence. Dote na 2i!ura # -ue estas colunas estão com tamanho defa lt 43SS caracteres6.!ableA MEntitC M!able4nameFGpopulacaoG6 public class 9essoa P . uma anotação )&a3.s da tabela se chamar <pessoa=. 9or e"emplo.umn("en!t943+) precisam ser adicionadas em cada uma das propriedades conforme podemos verificar na "ista!em :.. então anotaç%es )8o.EntitCA import java". Es-uema da tabela população com os tamanhos alterados. Es-uema da tabela pessoa. 'utro e"emplo de controle sobre o mapeamento objeto2relacional . pac)age com. 2i!ura $.S caracteres. E"istem muitos detalhes espec+ficos sobre o mapeamento objeto2relacional -ue voc$ pode ter total controle usando anotaç%es do padrão EJB .umn(.2i!ura #.!ableA MEntitC )&a3.persistence.persistencedemoA import java".persistencedemoA import import import import java".. :nclusão da anotação -ue especifica a tabela onde será reali0ada a persist$ncia.acao5) precisa ser adicionada para a classe 9essoa conforme pode ser visto na "ista!em 6.persistence.:dA java". :nclusão da anotação -ue indica o tamanho da coluna na tabela.>olumnA import java". se desejarmos arma0enar objetos da classe 9essoa em uma tabela chamada <populacao=. Lma ve0 -ue um EntitCManager foi criado.digo -ue recupera todas as instHncias de 9essoa do nosso banco de dados.hb'(ddl. <população= e não <pessoa=. uma entidade pode ser recuperada a partir deste EntitCManager e"ecutando m. ou se alterarmos a propriedade hibernate. apresentado um e"emplo simples de c. ela não será e"clu+da e.EntitCManagerA java". *-ui vale observar -ue a classe 9essoa possui uma anotação informando -ue o nome da tabela .KuerCA public class 1ead9opulacao P public static void main4StringVW args6 P EntitCManagerEactorC emf F 9ersistence.out.persistence.createEntitCManager46A II recupera todas as entidades 9essoas. ela será recriada com os novos tamanhos definidos.todos de consultas.9ersistenceA java". Entretanto.m.persistence.digo -ue recupera todas as instHncias da classe 9essoa do nosso banco de dados.persistence.EntitCManagerEactorCA java".createKuerC4Gfrom 9essoaG6A (ist results F -uerC. a consulta . não alterará os valores já e"istentes e utili0ados -uando da criação da tabela.. ele usará os valores representados nas anotaç%es. >.@ <from 9essoa=.en!t943+) public String getSobrenome46 P return sobrenomeA Q Q *gora. feita referenciando o nome <9essoa=.get1esult(ist46A for 49essoa p @ results6 P SCstem.(istA import import import import java".persistence. "ista!em #0. Se a tabela já e"istir.umn(. KuerC -uerC F em. isso mostra -ue a consulta fa0 refer$ncia ao nome da classe e não ao nome da tabela.public String getDome46 P return nomeA Q )8o. -uando o &ibernate recriar a tabela. 9or. Da "ista!em #0 .. conforme "ista!em 6. . -uando o &ibernate criar a tabela.tando entidades >onsultar as Entidades no banco de dados pode ser tão simples -uanto arma0ená2 las. pac)age com. 8onsu. :sso acontece se e"cluirmos a tabela e"plicitamente do banco de dados e ela não mais e"istir.util.println4p6A Q Q Q * consulta e"ecutada para retornar a lista de pessoas cadastradas . portanto.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.persistencedemoA import java.a to para o valor <create= ou <create2drop=. .EntitCA java"...digo -ue parametri0a a consulta ao nosso banco de dados.e. ' c. 5amos e"plorar agora um modelo de objetos ligeiramente mais comple"o. agora demonstraram os procedimentos fundamentais de arma0enamento e recuperação de entidades a partir do banco de dados.get1esult(ist46A . G9intoG6A (ist results F -uerC.persistence. uma string -ue corresponde ao to*en da consulta.* consulta anterior recupera todas as instHncias de 9essoa a partir do banco de dados. a string <sobrenome= se refere a um atributo da classe 9essoa. Dote -ue o nome da coluna no banco de dados não . * classe 9essoa está isolada sem nenhum relacionamento com outras entidades. ' to*en<sobreno'ePara'= representa um parHmetro na consulta -ue precisa ser povoado antes -ue a consulta seja e"ecutada.s do m. Da nossa consulta. >onsidere uma classe <>arro= e uma classe <Motor= onde o relacionamento entre as duas .:dA java". -ue .persistencedemoA import import import import import java". II recupera todas as 9essoas com sobrenome F G9intoG String -rCString F Gfrom 9essoa Bhere sobrenome F @sobrenome9aramGA KuerC -uerC F em.'ne!o'neA MEntitC public class >arro P private private private private String fabricanteA String modeloA Motor motorA :nteger idA public >arro46 P this4null. "ista!em ##. null6A Q public >arro4String fabricante. *s classes <>arro= e <Motor= são definidas de acordo com a "ista!em #$. Esta nossa consulta pode ser parametri0ada para reali0ar uma consulta mais espec+fica. o valor -ue será atribu+do no lugar do to*en.acionamento entre as Entidades 's e"emplos utili0ados at. . !odo carro tem e"atamente um motor e um motor não pode pertencer a mais de um carro. e o segundo argumento . Da consulta.persistence. ' parHmetro . pac)age com.persistence. omitido na chamada do m. >.. null. .set9arameter4Gsobrenome9aramG. "ista!em #$. um para um. Lma consulta pode ter -ual-uer nJmero de parHmetros.digo da "ista!em ## recupera somente as instHncias de 9essoas onde o <sobrenome= . *rma0enar grafos comple"os de entidades não .>ascade!CpeA java". o to*en . necessariamente o mesmo nome do atributo da classe.todo <setPara'eter= onde o primeiro argumento . Engine motor6 P . String modelo. <9into=.Tenerated5alueA java". precedido por <@= 4dois pontos6.persistence.digo -ue representa os 9'J's >arro e Motor.createKuerC4-rCString6A -uerC. tão mais complicado do -ue vimos at. >. povoado atrav. agora.todo <setPara'eter=.persistence. motor F motorA Q M'ne!o'ne4cascade F >ascade!Cpe.modelo F modeloA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.fabricante F fabricanteA this.9E1S:S!6 public Motor getMotor46 P return motorA Q public void setMotor4Motor motor6 P this.EntitCA import java".this.Tenerated5alueA import java".persistence.:dA MEntitC public class Motor P private :nteger idA private int cilindrosA .persistence.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 this.persistence.persistencedemoA import java".id F idA Q public String toString46 P return fabricante R G G R modeloA Q Q pac)age com. indicando para o mecanismo de persist$ncia -ue o relacionamento entre o >arro e seu Motor .cilindros F cilindrosA Q Q 5eja -ue o m.private int cm>ubicosA private String fabricanteA public Motor46 P Q public Motor4int cilindros. Sem esta informação.PE.fabricante F fabricanteA Q public int get>ilindros46 P return cilindrosA Q public void set>ilindros4int cilindros6 P this. o Motor teria -ue ser .todo getMotor na classe >arro está com a anotação )One&oOne.fabricante F fabricanteA Q public int get>m>ubicos46 P return cm>ubicosA Q public void set>m>ubicos4int cm>ubicos6 P this. String fabricante6 P this./I/&= indica ao mecanismo de persist$ncia -ue este deve automaticamente persistir a propriedade Motor -uando um >arro .cm>ubicos F cm>ubicosA this. persistido. o trecho <cascade 4 8ascade&ype. um relacionamento um2para2um. >omplementando a representação da cardinalidade.id F idA Q public String getEabricante46 P return fabricanteA Q public void setEabricante4String fabricante6 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.cilindros F cilindrosA this. int cm>ubicos. .begin46A Motor motor7 F neB Motor4X. "ista!em #3.hibernate.persist4carro36A t". G>orsaG.persistencedemo.. ' c. G!ritonG6A >arro carro7 F neB >arro4GEordG.>arro com. 1elacionamento um2para2um entre carro e motor. ' es-uema padrão gerado para este modelo de objeto .Motor . motor76A Motor motor3 F neB Motor48.s do EntitCManager. motor36A II os Motores serão automaticamente arma0enados por-ue II os >arros os fa0em refer$ncias.close46A *ntes de e"ecutar o c. 3X/.x'l= com os elementos de classe 46 apropriados conforme a "ista!em #*. *lteração do nosso conte"to de persist$ncia para inclusão das classes de interesse.S/.&ibernate9ersistence com.persist4carro76A em.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.e"plicitamente persistido..digo -ue cria alguns carros e motores e os persiste atrav.get!ransaction46A t".commit46A em.createEntitCManager46A EntitC!ransaction t" F em. GTMG6A >arro carro3 F neB >arro4G>hevroletG.. "ista!em #*.persistencedemo.digo temos -ue atuali0ar o ar-uivo <persistence. algo conforme a 2i!ura 3. 'bserve -ue não e"iste . 2i!ura 3. EntitCManagerEactorC emf F 9ersistence . GE27S/G.digo da "ista!em #3 cria alguns >arros e Motores e os salva no banco de dados. . >. em.cnica -ue vimos para recuperar as instHncias de 9essoas 4"ista!em #+6.ejb. org. :nstHncias de >arros podem ser recuperadas usando a mesma t. *rraC(istA import java.'ne!oManCA P MEntitC public class > private String artistaA private String tituloA . "ista!em #1.out.:dA java".(istA import import import import import java".e. Esta . ' detalhe da navegação está na nossa consulta <from >arro Bhere motor.os re.persistence. 1ecuperação das informaç%es do banco de dados.s do m.getMotor46A SCstem.acionamento <m=para= uitos 9ara representar um relacionamento um2para2muitos devemos utili0ar a anotação )One&o any.todo set9arameter.println4G>arro@ G R c6A Motor e F c.acionamentos 9odemos navegar entre os relacionamentos das entidades para restringir os resultados baseando2se em algumas propriedades -ue são propagadas no nosso grafo de objetos.>ascade!CpeA java". transparente. "ista!em #+. *tribu+mos ao parHmetro o valor X 4oito6 atrav. -uerC.s do nJmero de cilindros de seu Motor. 9or e"emplo.println4GDJmero de cilindros@ G R e. 9ara isso.pria consulta.nenhuma necessidade de informar -ual-uer coisa sobre a classe Motor na nossa consulta.cilindros F @numcilindrosGA KuerC -uerC F em.persistence. e"ecutada retornando o resultado esperado.println4p6A Q .persistencedemoA import java. * navegação entre as classes e tabelas fica transparente. 9erceba -ue estamos recuperando instHncias da classe >arro fa0endo refer$ncia a uma propriedade da classe motor na pr.. primeiro definimos a consulta -ue -ueremos reali0ar e a parametri0amos utili0ando o parHmetro <numcilindros=.out.persistence. e em seguida a consulta .digo para relacionamento Lm2para2Muitos. KuerC -uerC F em.persistence. na "ista!em #0 carros podem ser consultados atrav. eles são recuperados sem problemas.util.Tenerated5alueA java".get1esult(ist46A for 4>arro p @ results6 P SCstem..set9arameter4Gnumcilindros G.cilindros F @numcilindros=. String -rCString F Gfrom >arro Bhere motor.createKuerC4Gfrom >arroG6A (ist results F -uerC. X6A (ist results F -uerC. pac)age com.get>ilindros466A Q %ave!ando pe. "ista!em #0.get1esult(ist46A for 4>arro c @ results6 P SCstem.EntitCA java". a recuperação de Motor . E"emplo de c. 1ecuperando os carros -ue são X cilindros.out.persistence.util. >onsidere um relacionamento entre um > de mJsica e todas as fai"as contidas neste > 4ver"ista!em #1).createKuerC4-rCString6A II recupera somente os carros com motores de X cilindros. aplicada na propriedade -ue representa a coleção no lado -ue possui o relacionamento. artista F artistaA this./I/& ?) public (ist getEai"as46 P return fai"asA Q public void setEai"as4(ist fai"as6 P this.titulo F tituloA Q public void addEai"a4Eai"a fai"a6 P fai"as.PE.private (ist fai"as F neB *rraC(ist46A private :nteger idA public > 46 P Q public > 4String artista.id F idA Q public String get!itulo46 P return tituloA Q public void set!itulo4String titulo6 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. String titulo6 P this.add4fai"a6A Q public String get*rtista46 P return artistaA Q public void set*rtista4String artista6 P this.persistencedemoA .fai"as F fai"asA Q public String toString46 P return tituloA Q Q pac)age com.titulo F tituloA Q )One&o any(cascade 4 > 8ascade&ype. persistence.duração F duracaoA this. .duracao F duracaoA Q M:d MTenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.titulo F tituloA Q Q ' es-uema padrão gerado para o relacionamento um2para2muitos pode ser visto na 2i!ura *.EntitCA import java".titulo F tituloA Q public int get uracao 46 P return duracaoA Q public void set uracao4int duracao6 P this.Tenerated5alueA import java".import java".:dA MEntitC public class Eai"a P private int duraçaoA private String tituloA private :nteger idA public Eai"a46 P Q public Eai"a4int duracao. String titulo6 P this.persistence.id F idA Q public String get!itulo46 P return tituloA Q public void set!itulo4String titulo6 P this.persistence. fai"as6 fai"a Bhere fai"a. observada na consulta da "ista!em #:.digo -ue cria alguns >ds e suas fai"as e os persiste atrav. utili0ada para navegar no relacionamento um2para2 um. 1elacionamento um2para2muitos. G(a0CG66A em.addEai"a4neB Eai"a433/.addEai"a4neB Eai"a43//.2i!ura *.addEai"a4neB Eai"a47X/.createKuerC4-rCString6A II recupera todos os >ds -ue contem a fai"a G(a0CG -uerC. >.titulo F @tituloEai"aGA KuerC -uerC F em. G rive MC >arG66A em.createEntitCManagerEactorC4GmCconte"tG6A EntitCManager em F emf.set9arameter4GtituloEai"aG.createEntitCManager46A EntitC!ransaction t" F em. 9erceba -ue o mecanismo para persistir as instHncias da classe > . GMachine &eadG6A cd. G(a0CG6A (ist results F -uerC.fai"as= -ue navega de uma instHncia de > para suas fai"as relacionadas. GSmo)e 'n !he ?aterG66A cd. G1ubber SoulG6A cd.get1esult(ist46A for 4> c @ results6 P SCstem. Da "ista!em #6 vemos como .commit46A em. Essa diferença .s do EntitCManager.persist4cd6A cd F neB > 4G eep 9urpleG.begin46A > cd F neB > 4G!he BeatlesG. GDorBegian ?oodG66A cd. "ista!em #6. o procedimento para persistir novos > s e suas fai"as.persist4cd6A t".out. onde temos -ue a palavra <in= significa -ue Gfai"asG .get!ransaction46A t". muito parecido com o -ue utili0amos para persistir instHncias de >arros na "ista!em #3. "ista!em #:. EntitCManagerEactorC emf F 9ersistence.addEai"a4neB Eai"a4YX/. String -rCString F Gselect cd from > as cd.println4c6A . e a e"pressão <cd. 1ecuperando os > s -ue cont. in 4cd. uma coleção de instHncias relacionadas.m a fai"a <(a0C=.close46A Davegar no relacionamento entre um > e suas Eai"as apresenta uma sinta"e ligeiramente diferente da -ue . ..Q * string <cd= em minJsculo -ue aparece em vários lugares no c.digo acima . os desenvolvedores devem definir seus relacionamentos de objetos sem ter compromisso como os objetos serão arma0enados no banco de dados. MEntitC M:nheritance4strategC F :nheritance!Cpe. * consulta apresentada na "ista!em #: pode ser dividida em alguns pedaços para um melhor entendimento.titulo F @tituloEai"a=@ restringe apenas os casos onde cd. • <select cd from > as cd=@ significa -ue estamos consultando > s e referenciando estes > s com o alias <cd=A • <in 4cd. a manipulação de relacionamentos de herança.m um atributo representando o nJmero de pneus -ue um ve+culo tem.digo destas classes . null. ' atributo motor se refere a um objeto Motor. :dealmente. Mapeamento de herança onde utili0amos a abordagem de uma tabela para cada classe. modelo e motor como atributos. Motor motor6 P . >arro e Bicicleta. null6A Q public >ar4String fabricante. a classe pai de >arro e Bicicleta.acionamentos de 9eran'a Lm dos aspectos mais desafiadores no mapeamento objeto2relacional .fai"as6 fai"a=@ está associando o nome <fai"a= para cada elemento da coleção <cd. 5e+culo . 9arte do c.fai"as cont. * classe 5e+culo cont. Este alias não precisa ser igual ao nome da classe. >ertamente a J9* nos fornece bastante fle"ibilidade -uanto a isso. String modelo.todo set9arameter. um alias -ue pode ser -ual-uer coisa. "ista!em $0.fai"as=A • <Bhere fai"a. povoado em seguida com a chamada do m. * classe Bicicleta tem um simples atributo -ue representa o nJmero de marchas -ue a bicicleta tem. >onsidere um modelo de objetos composto por 5e+culo. apeando re.num9neus F num9neusA Q . * classe >arro tem fabricante. Q MEntitC public class >arro e"tends 5eiculo P private String fabricanteA private String modeloA private Motor motorA public >arro46 P this4null.J':DE 6 public abstract class 5eiculo P private :nteger idA private int num9neusA public 5eiculo4int num9neus6 P this. mas no nosso caso isto acontece.m uma fai"a com o nome -ue seja igual ao valor do parHmetro <tituloEai"a= -ue . apresentado na "ista!em $0. .m de uma tabela compartilhada -ue cont. Esta anotação indica para o mecanismo de persist$ncia -ue o mapeamento da herança deve ser implementado usando junç%es no banco de dados..m o atributo representando a classe 5eiculo. Q MEntitC public class Bicicleta e"tends 5eiculo P private int numMarchasA public Bicicleta46 P this4/6A Q public BicCcle4int numMarchas6 P super436A this. Q Dote a anotação <)In9eritance(strate!y 4 In9eritance&ype..prias tabelas no banco de dados al.. .numMarchas F numMarchasA Q . ' es-uema padrão gerado para essas classes seria algo semelhante # 2i!ura +. :sto significa -ue a classe Bicicleta e a classe >arro terão cada uma suas pr.fabricante F fabricanteA this.Q super4Y6A this. *s tabelas de carro e de bicicleta se relacionam # tabela de ve+culo usando junção.modelo F modeloA this.JOI%E@)= na classe 5eiculo.motor F motorA . Q MEntitC M iscriminator5alue4G>G6 public class >arro e"tends 5eiculo P . Mapeamento de herança onde utili0amos a abordagem de uma Jnica tabela para toda a herança. 'utro modo de mapear o mesmo relacionamento . Q MEntitC M iscriminator5alue4GBG6 public class Bicicleta e"tends 5eiculo P ..... Se as instHncias de >arro e Bicicleta forem arma0enadas juntas em uma mesma tabela.2i!ura +. usando uma Jnica tabela.S:DT(EZ!*B(E6 public abstract class 5eiculo P . utili0a uma coluna com esse prop.sito. precisamos de alguma coisa na tabela -ue indi-ue -ue tipo de 5eiculo está representado em cada linha. MEntitC M:nheritance4strategC F :nheritance!Cpe. * persist$ncia EJB . "ista!em $#. Es-uema gerado para o mapeamento com uma tabela para cada classe. * "ista!em $# mostra a anotação re-uerida para mapear nossas tr$s classes usando uma Jnica tabela. Esta coluna simplesmente arma0ena um valor para indicar -ue tipo de objeto está arma0enado em cada linha. .prias tabelas. onde o valor discriminat. * coluna ![9E .rio será arma0enado.. Q * anotação )@iscriminator-a. e os atributos -ue são herdados da superclasse são inclu+dos nas tabelas da subclasse. Es-uema gerado para o mapeamento com tabela Jnica para toda a herança.. Q MEntitC public class Bicicleta e"tends 5eiculo P . ' es-uema padrão para este mapeamento pode ser visto na 2i!ura 0. 2i!ura 0. Q MEntitC . Mapeamento da superclasse abstrata nas tabelas da subclasse. 'utra possibilidade no mapeamento de relacionamentos de heranças . "ista!em $$.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.. MMappedSuperclass public abstract class 5eiculo P .. eliminando assim a necessidade de e"istir uma tabela para a superclasse abstrata. Este mapeamento . não e"iste uma tabela espec+fica para a classe abstrata.. Esta alternativa pode ser vista na "ista!em $$. criar uma tabela para cada classe concreta da hierar-uia. indicado pela anotação MMappedSuperclass e resulta -ue cada uma das subclasses concretas tem suas pr.. digo escrito em J B> ou com outra solução de mapeamento objeto2 relacional. Es-uema gerado para o mapeamento com uma tabela para cada classe concreta. ' objetivo . instalar um ambiente de desenvolvimento -ue permita a e"ecução dos e"emplos apresentados neste artigo. 's e"emplos simples apresentados anteriormente mostram mudanças significantes para o mapeamento -ue não re-uerem mudanças no modelo de objetos. -ue estas informaç%es sirvam como um guia prático para ajudar aos desenvolvedores começarem a trabalhar com a *9: de persist$ncia Java 4J9*6. >ada uma das opç%es apresentadas acima usa e"atamente o mesmo modelo de objetos. 8onc. 's desenvolvedores t$m muito controle de como o modelo de objeto será mapeado para o banco de dados.usAo 's e"emplos apresentados neste artigo são apenas o princ+pio da capacidade da especificação de persist$ncia EJB . *s diferenças dos es-uemas são somente os metadados representados pelas anotaç%es. 2i!ura 1. muito mais direta e fácil de trabalhar. 's desenvolvedores irão constatar -ue. apresentado na 2i!ura 1. Dote -ue o atributo <num9neus= e"iste na tabela bicicleta e na tabela carro. a *9: de 9ersist$ncia Java 4J9*6 ./. . Q ' es-uema padrão gerado para essa escolha de mapeamento .. comparando com c. * melhor forma de começar com a *9: .eBerências JS1233/ 2 &ibernate 2 ...public class >arro e"tends 5eiculo P . M. possui especiali0ação em *dministração e !unning de banco de dados pela 9L>21J e MB* em Engenharia de SoftBare pela >Hndido Mendes. Pinto 4marcioaopinto+g'ail. . em Sistemas de :nformação pela Lniversidade Eederal do 1io de Janeiro 4D>EILE1J6.Crcio A.co'6 .eDandre de O. *tualmente .Sc. Bacharel em >i$ncia da >omputação pela Lniversidade Eederal do 1io de Janeiro 4LE1J6. *nalista de Sistemas da 9etrobras.