Preview only show first 10 pages with watermark. For full document please download

Persistência Com Ejb 3

   EMBED


Share

Transcript

Persistência com EJB 3.0 A API de Persistência Java (JPA) Enterprise Java Beans foram 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 per sist$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 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  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=  providers= de fabricantes distintos, -ue estejam em conformidade com a JS1233/, sem nenhum esforço adicional. Enterprise Java Beans foram Beans foram tradicionalmente associados com containers pesados containers pesados como JBoss, ?ebsphere, ?eb(ogic e outros. Estes containers fornecem 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 frameor) 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  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  em um ambiente Java EE  ligeiramente diferente da tcnica para recuperar um EntityManager  em  em um ambiente Java SE. 9or simplicidade, os e"emplos a-ui apresentados estão focados no ambiente Java SE, assim, nenhum container  precisa  precisa ser configurado. Da (istagem 7 temos o trecho de c;digo referente # criação do EntitCManager a partir de uma EntitCManager actorC em um ambiente Java SE. "ista!em #. >riação #. >riação do EntitCManager. import java".persistence.EntitC java".persistence.EntitCManagerA ManagerA import java".persistence.EntitC java".persistence.EntitCManageractorCA ManageractorCA import java".persistence.9ersist java".persistence.9ersistenceA enceA ... EntitCManageractorC emf F   9ersistence.createEntitCManageractorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A 9ara -ue uma entidade se torne persistente  necessário associá2la a um contexto de persistência, 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 4 entidades 4EntityManager  EntityManager 6. 6. ' gerenciador de entidades na J9*  uma instHncia da interface javax.persistence.EntityMa interface  javax.persistence.EntityManager  nager . ' 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:D ou em algum ar-uivo <.jar= -ue esteja no seu >(*SS9*!&. >( *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:DIpersistence."ml, então se o ar-uivo está em  IlocalIdevIstuffIME!*2:DIpersistence."ml  IlocalIdevIstuffIME!*2:DIpersistence."ml precisamos precisamos ter o caminho  IlocalIdevIstuffI no >(*SS9*!&, e não IlocalIdevIstuffIME!*2:D IlocalIdevIstuffIME!*2:DI. I. Da (istagem 3  apresentado o e"emplo de um descritor de conte"to de persist$ncia. "ista!em $. escritor $. 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 arbitrário, 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 várias 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 configuração 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 serão 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 arbitrárias sejam atribu+das e passadas para o provedor de persist$ncia. Estas propriedades são normalmente configuraç%es espec+ficas do fornecedor da classe do provedor. ' ar-uivo descritor  o nico lugar onde veremos detalhes sobre -ual-uer implementação particular da J9*. !odo o c;digo da aplicação mostrado a seguir  independente de fornecedor, e por isso um padrão. 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 especificação EJB ./ trou"e algumas mudanças para cada tipo de EJB. Estamos interessados a-ui apenas nos EJBs do tipo Entity Beans. Entidades são 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 são@ 9recisa possuir um construtor sem argumentosA Dão possuir nenhum mtodo final A * classe não pode ser final# 9recisa ser marcada com Entity  4ou ter um descritor NM( apropriado6. • • • • %ota #. &ipos EJB >ada um dos outros tipos de EJBs possuem caracter+sticas espec+ficas -ue não entraremos em detalhe nesse artigo, mas como e"emplo@ Stateless Session Beans precisam ter a anotação 4ler %ota 36 Stateless, já os do tipo Statefl Session Beans precisam da anotação Stateful e os do tipo Message!driven Beans precisam da anotação Messageriven. %ota $. POJO 9'J', um acrOnimo para 9lain 'ld Java 'bjects, define um objeto -ue não possui nenhuma caracter+stica especial. Lm 9'J'  um objeto Java normal -ue não implementa nenhuma interface nem estende nenhuma classe espec+fica de um frameor). POJO Da "ista!em 3  apresentado um 9'J' simples -ue poderemos arma0enar utili0ando o padrão 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 Q %ota 3. Anota'es * persist$ncia em EJB  tira vantagem das anotaç%es do Java . * persist$ncia EJB  não re-uer a e"ist$ncia do Java . !udo -ue podemos fa0er atravs de anotaç%es podemos tambm fa0er usando um descritor NM(. Dossos e"emplos estão baseados na solução 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 mudanças para fa0er na classe 9essoa. 9rimeiro, precisamos marcar a classe com Entity, de acordo com a "ista!em *. "ista!em *.  :nclusão da anotação EntitC 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 olumnA import java".persistence.EntitCA import java".persistence.!ableA EntitC !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 Q *gora, -uando o &ibernate criar a tabela, ele usará os valores representados nas anotaç%es. Se a tabela já e"istir, ela não será e"clu+da e, portanto, não alterará os valores já e"istentes e utili0ados -uando da criação 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 não mais e"istir, ou se alterarmos a propriedade hibernate.hb'(ddl.ato para o valor  onsultar as Entidades no banco de dados pode ser tão simples -uanto arma0ená2 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 java".persistence.EntitCManagerA import java".persistence.EntitCManageractorCA import java".persistence.9ersistenceA import java".persistence.KuerCA public class 1ead9opulacao P public static void main4StringVW args6 P EntitCManageractorC emf F   9ersistence.createEntitCManageractorC4GmCconte"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 @ ;digo -ue parametri0a a consulta ao nosso banco de dados. ...  II recupera todas as 9essoas com sobrenome F G9intoG String -rCString F Gfrom 9essoa here sobrenome F @sobrenome9aramGA KuerC -uerC F em.createKuerC4-rCString6A -uerC.set9arameter4Gsobrenome9aramG, G9intoG6A (ist results F -uerC.get1esult(ist46A ... Da nossa consulta, a string onsidere uma classe <>arro= e uma classe arro= e ;digo -ue representa os 9'J's >arro e Motor. pac)age com.persistencedemoA import java".persistence.>ascade!CpeA import java".persistence.EntitCA import java".persistence.Tenerated5alueA import java".persistence.:dA import java".persistence.'ne!o'neA EntitC 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 '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 getabricante46 P return fabricanteA Q public void setabricante4String fabricante6 P this.fabricante F fabricanteA Q public String getModelo46 P return modeloA Q public void setModelo4String modelo6 P this.modelo F modeloA Q :d   Tenerated5alue 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 EntitC 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 :d   Tenerated5alue public :nteger get:d46 P return idA Q public void set:d4:nteger id6 P this.id F idA Q public String getabricante46 P return fabricanteA Q public void setabricante4String 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 anotação One&oOne, indicando para o mecanismo de persist$ncia -ue o relacionamento entre o >arro e seu Motor  um relacionamento um2para2um. >omplementando a representação da cardinalidade, o trecho arro  persistido. Sem esta informação, 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. EntitCManageractorC emf F 9ersistence   .createEntitCManageractorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A EntitC!ransaction t" F em.get!ransaction46A   t".begin46A Motor motor7 F ne Motor4X, /, G!ritonG6A >arro carro7 F ne >arro4GordG, G27/G, motor76A Motor motor3 F ne Motor48, 3X/, GTMG6A >arro carro3 F ne >arro4G>hevroletG, G>orsaG, motor36A          II os Motores serão 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 #*. *lteração do nosso conte"to de persist$ncia para inclusão das classes de interesse. org.hibernate.ejb.&ibernate9ersistence   com.persistencedemo.>arro   com.persistencedemo.Motor ... ' es-uema padrão 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 não e"iste nenhuma necessidade de informar -ual-uer coisa sobre a classe Motor na nossa consulta, eles são recuperados sem problemas. "ista!em #+. 1ecuperação das informaç%es do banco de dados, a recuperação 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.println4GDmero 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 são pr opagadas no nosso grafo de objetos. 9or e"emplo, na "ista!em # carros podem ser consultados atravs do nmero de cilindros de seu Motor. 9ara isso, primeiro definimos a consulta -ue -ueremos reali0ar e a parametri0amos utili0ando o parHmetro  arro here 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. * navegação entre as classes e tabelas fica transparente. "ista!em #. 1ecuperando os carros -ue são X cilindros. String -rCString F Gfrom >arro here 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 onsidere um relacionamento entre um > de msica 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 java".persistence.>ascade!CpeA import java".persistence.EntitCA import java".persistence.Tenerated5alueA import java".persistence.:dA import java".persistence.'ne!oManCA EntitC public class > P private String artistaA private String tituloA private (ist fai"as F ne *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 addai"a4ai"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 :d   Tenerated5alue 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 getai"as46 P return fai"asA Q public void setai"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 EntitC public class ai"a P private int duraçaoA private String tituloA private :nteger idA public ai"a46 P Q public ai"a4int duracao, String titulo6 P this.duração 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 :d   Tenerated5alue 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 Q ' es-uema padrão 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. EntitCManageractorC emf F   9ersistence.createEntitCManageractorC4GmCconte"tG6A EntitCManager em F emf.createEntitCManager46A EntitC!ransaction t" F em.get!ransaction46A   t".begin46A > cd F ne >4G!he BeatlesG, G1ubber SoulG6A cd.addai"a4ne ai"a433/, GDoregian ?oodG66A cd.addai"a4ne ai"a47X/, Grive MC >arG66A   em.persist4cd6A cd F ne >4Geep 9urpleG, GMachine &eadG6A cd.addai"a4ne ai"a43//, GSmo)e 'n !he ?aterG66A cd.addai"a4ne ai"a4YX/, G(a0CG66A   em.persist4cd6A t".commit46A   em.close46A Davegar no relacionamento entre um > e suas ai"as apresenta uma sinta"e ligeiramente diferente da -ue  utili0ada para navegar no relacionamento um2para2 um. Essa diferença  observada na consulta da "ista!em #:, onde temos -ue a palavra  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 here fai"a.titulo F @tituloai"aGA KuerC -uerC F em.createKuerC4-rCString6A  II recupera todos os >ds -ue contem a fai"a G(a0CG -uerC.set9arameter4Gtituloai"aG, G(a0CG6A (ist results F -uerC.get1esult(ist46A for 4> c @ results6 P   SCstem.out.println4c6A Q * string  as cd=@ significa -ue estamos consultando >s e referenciando estes >s com o alias 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 nmero 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 nmero de marchas -ue a bicicleta tem. 9arte do c;digo destas classes  apresentado na "ista!em $0. "ista!em $0. Mapeamento de herança onde utili0amos a abordagem de uma tabela para cada classe. EntitC :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 EntitC 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 ... Q EntitC 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 anotação <In9eritance(strate!y 4 In9eritance&ype.JOI%E@)= na classe 5eiculo. 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. :sto significa -ue a classe Bicicleta e a classe >arro terão 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 junção. ' es-uema padrão 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 nica 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 anotação re-uerida para mapear nossas tr$s classes usando uma nica tabela. "ista!em $#. Mapeamento de herança onde utili0amos a abordagem de uma nica tabela para toda a herança. EntitC :nheritance4strategC F :nheritance!Cpe.S:DT(EZ!*B(E6 public abstract class 5eiculo P ... Q EntitC iscriminator5alue4G>G6 public class >arro e"tends 5eiculo P ... Q EntitC iscriminator5alue4GBG6 public class Bicicleta e"tends 5eiculo P ... Q * anotação @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 padrão para este mapeamento pode ser visto na 2i!ura . 2i!ura . Es-uema gerado para o mapeamento com tabela nica para toda a herança. * coluna ![9E  onde o valor discriminat;rio será arma0enado. 'utra possibilidade no mapeamento de relacionamentos de heranças  criar uma tabela para cada classe concreta da hierar-uia. Este mapeamento  indicado pela anotação MappedSuperclass e resulta -ue cada uma das subclasses concretas tem suas pr;prias tabelas, e os atributos -ue são herdados da superclasse são 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, não e"iste uma tabela espec+fica para a classe abstrata. MappedSuperclass public abstract class 5eiculo P ... Q EntitC public class Bicicleta e"tends 5eiculo P ... Q EntitC public class >arro e"tends 5eiculo P ... Q ' es-uema padrão 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 ada uma das opç%es apresentadas acima usa e"atamente o mesmo modelo de objetos. *s diferenças dos es-uemas são somente os metadados representados pelas anotaç%es. 8oncuso 's e"emplos apresentados neste artigo são apenas o princ+pio da capacidade da especificação de persist$ncia EJB ./. ' objetivo  -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. * melhor forma de começar com a *9:  instalar um ambiente de desenvolvimento -ue permita a e"ecução dos e"emplos apresentados neste artigo. 's desenvolvedores irão constatar -ue, comparando com c;digo escrito em JB> ou com outra solução de mapeamento objeto2 relacional, a *9: de 9ersist$ncia Java 4J9*6  muito mais dire ta e fácil de trabalhar. ;eerências JS1233/ 2 &ibernate 2 Crcio AeDandre de O. Pinto 4marcioaopinto+g'ail.co'6  M.Sc. em Sistemas de :nformação pela Lniversidade ederal do 1io de Janeiro 4D>EIL1J6, Bacharel em >i$ncia da >omputação pela Lniversidade ederal do 1io de Janeiro 4L1J6, possui especiali0ação em *dministração e !unning de banco de dados pela 9L>21J e MB* em Engenharia de Softare pela >Hndido Mendes. *tualmente  *nalista de Sistemas da 9etrobras.