201
Desenvolvimento Distribu´ ıdo Prof. Rafael Guimar˜aes Sakurai Junho/2014

Desenvolvimento Distribuido

Embed Size (px)

DESCRIPTION

Desenvolvimento com JPA, EJB e WebServices

Citation preview

Desenvolvimento DistribudoProf. RafaelGuimaraesSakuraiJunho/2014Sumario1 JPA(JavaPersistenceAPI) 51.1 Entity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.1.1 AnotacoesparaEntity . . . . . . . . . . . . . . . . . . 91.1.2 ExemplodeEntity . . . . . . . . . . . . . . . . . . . . 111.2 EntityManager . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2.1 UnidadedePersistencia . . . . . . . . . . . . . . . . . 151.2.2 CriandoumaunidadedepersistencianoNetBeans . . . 171.2.3 EntityManagergerenciadopelaAplicac ao . . . . . . . 221.2.4 EntityManagergerenciadopeloContainer . . . . . . . 251.2.5 InterfaceEntityManager . . . . . . . . . . . . . . . . . 261.2.6 CiclodevidadaEntity. . . . . . . . . . . . . . . . . . 281.3 ExemplodeDAO(CRUD)utilizandoJPA . . . . . . . . . . . 291.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Chaveprimaria 462.1 EstrategiadeSEQUENCEparagerarID. . . . . . . . . . . . 462.2 Utilizandochavecomposta. . . . . . . . . . . . . . . . . . . . 483 RelacionamentoentreEntitys 553.1 H aquatrotiposdecardinalidade . . . . . . . . . . . . . . . . 553.1.1 Um-para-Um(OneToOne) . . . . . . . . . . . . . . . . 553.1.2 Um-para-Muitos(OneToMany) . . . . . . . . . . . . . 603.1.3 Muitos-para-Muitos(ManyToMany) . . . . . . . . . . 803.2 javax.persistence.CascadeType. . . . . . . . . . . . . . . . . . 843.3 javax.persistence.FetchType . . . . . . . . . . . . . . . . . . . 843.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854 ConsultascomEJB-QL 994.1 Interfacejavax.persistence.Query . . . . . . . . . . . . . . . . 1034.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075 Componente 1106 JavaNamingandDirectoryInterface 1127 RemoteMethodInvocation 11318 IntroducaoaoEnterpriseJavaBeans3.0 1148.1 EJB(EnterpriseJavaBeans) . . . . . . . . . . . . . . . . . . . 1148.1.1 ContainerEJB . . . . . . . . . . . . . . . . . . . . . . 1148.1.2 TiposdeEJB. . . . . . . . . . . . . . . . . . . . . . . 1148.2 SessionBean . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158.2.1 StatelessSessionBean . . . . . . . . . . . . . . . . . . 1158.2.2 StatefulSessionBean. . . . . . . . . . . . . . . . . . . 1189 CriandoumprojetoEJB3.0noNetBeans 1209.1 CriandoomoduloEJB. . . . . . . . . . . . . . . . . . . . . . 1209.2 CriandoumEJBStatelessSessionBean: . . . . . . . . . . . . 1229.3 PublicandooprojetoEJBnoGlasssh: . . . . . . . . . . . . . 1239.4 CriandoumProjetoJavaConsoleparatestaroEJB: . . . . . 1249.5 TestandooEJB: . . . . . . . . . . . . . . . . . . . . . . . . . 1289.6 Melhorandoolookup . . . . . . . . . . . . . . . . . . . . . . . 1309.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13210Usandoaannotation@EJB 13211CriandoumaaplicacaoEJB+JPA 13611.1 CriandooProjetoEJB. . . . . . . . . . . . . . . . . . . . . 13611.2 Criandoasclassesdeneg ocio . . . . . . . . . . . . . . . . . . 13611.3 ClassesDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 14111.4 ComponentesEJB . . . . . . . . . . . . . . . . . . . . . . . . 14811.5 Criandoabasededados . . . . . . . . . . . . . . . . . . . . . 15411.6 Congurac aodacamadadepersistencia . . . . . . . . . . . . 15411.6.1 Adicionardodriverdobancodedados . . . . . . . . . 15511.6.2 CriarumdatasourcecompooldeconexaonoGlasssh 15511.6.3 Criararquivopersistence.xml . . . . . . . . . . . . . . 15712InterceptandoosEJBsparacriarobjetosDAOs 16013ExerccioaplicacaoEJB+JPA 17314WebServicescomEJB3.0 17514.1 Introduc ao. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17514.2 WebServiceDescriptionLanguage . . . . . . . . . . . . . . . 17514.3 SimpleObjectAccessProtocol(SOAP). . . . . . . . . . . . . 17714.4 CriandoumWebServicecomEJB3.0 . . . . . . . . . . . . . 178214.5 CriandoumclienteparaumWebService . . . . . . . . . . . . 18215CriandoumwebserviceREST 18615.1 ConsumindoumwebserviceREST . . . . . . . . . . . . . . . 19216Bibliograa 2003Parte 1Persistencia de dados41 JPA(JavaPersistenceAPI)OJavaPersistenceAPIeumframeworkparacamadadepersistenciadosdados(gura1),queforneceumacamadadecomunicac aoentreaaplicac aoescritaemJavaeobancodedados.Figura1: UsodoJPAnaaplicac aoJava.AlgumasfacilidadesqueoJPAoferecesao:ConversaoderegistrosdobancodedadosemobjetosJava;N ao precisa criar codigos SQL para salvar, alterar ou remover registrosdobancodedados;A aplicac ao nao ca presa a um banco de dados sendo simples a troca.Tambemaumentaaprodutividadedos desenvolvedores queutilizamobancodedados,deixandodeformatransparenteasuautiliza cao,principal-mentepornaodeixaraprogramac aoJavavinculadaaumtipoespeccodebancodedados.Paratrazerasinformac oesdobancodedadoseconverte-lasemclassesJava, acabasendoumpoucotrabalhoso. QuandoeusadoJDBCpuroh aanecessidadederealizaromapeamentoentreosatributosecolunasdobancode dados, `as vezes e necess ario fazer uma convers ao do tipo de dado declaradono banco de dados com o tipo de dado utilizado na classe. O mesmo processoocorrequandoosobjetosJavas aosalvosnobancodedados.5O JPA utiliza o conceito de mapeamentoobjeto/relacional(ORMObject/RelationalMapping)parafazerponteentreabasededadosrelacional eosobjetosJava. Agura2mostraoproprioframeworkfazorelacionamento entre os atributos das classes Java com a tabela do banco dedados.Figura2: RelacaodetabelaparaclasseJava.OJPAcriaumainst anciadaclasseProdutoparacadalinhadatabelaProduto, comomostradonagura3, etambematribui osvaloresdaspro-priedades da classe Produto de acordo com os valores das colunas da tabela.Por padr ao o JPA realizara o mapeamento da classe e atributos com o mesmonome.AtualmenteoJPAest anaversao2.1epodeserutilizadotantonocon-texto Java EE (Java Enterprise Edition) como Java SE (Java Standard Edi-tion).1.1 EntityUmaEntity(Entidade)eumobjetolevededomniopersistenteutilizadopararepresentarumatabeladabasededados,sendoquecadainst anciadaentidadecorrespondeaumalinhadatabela.AEntityebaseadaemumasimplesclasseJavadotipoPlainOldJava6Figura3: Relacaodelinhadatabelaparainst anciadeobjeto.Object (POJO), portantoumaclasseJavacomumcomanotacoesparafor-necerinformac oesmaisespecicaaogerenciadordasentidades.Exemplodeentityquerepresentaumproduto:package pbc . j pa . exemplo1 . e nt i t y ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Date ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . Temporal ;import j avax . pe r s i s t e nc e . TemporalType ;7/ Cl asse u t i l i z a d a para r epr es ent ar a t ab e l a Produto ./@Entitypublic cl ass Produto implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=4185059514364687794L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng de s c r i c ao ;@Temporal ( TemporalType .DATE)private Date dataVal i dade ;private Double peso ;public Date getDataVal i dade ( ) { return dataVal i dade ; }public void setDataVal i dade ( Date dataVal i dade ) {thi s . dataVal i dade =dataVal i dade ;}public St r i ng get Des cr i cao ( ) { return de s c r i c ao ; }public void s e t De s c r i c ao ( St r i ng de s c r i c ao ) {thi s . de s c r i c ao =de s c r i c ao ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public Double getPeso ( ) { return peso ; }public void s et Pes o ( Double peso ) { thi s . peso =peso ; }}Nesteexemploeutilizadaaanotacao@Entityparadenirestaclassecomo uma entidade do banco de dados. Utilizamos a anotacao @Id dene queo atributo Longid e chave primaria da tabela Produto; tambem e denidoqueoatributoLongidtemseuvalorgeradoautomaticamenteatravesdaanotac ao @GeneratedValue. Quando tem atributos que representam datas8ou tempos e necess ario adicionar a anotac ao @Temporal para denir que oatributoDatedataValidade eumcampoDatenobancodedados.O relacionamento feito entre a classe Java e a tabela do Banco de Dados,ocorre automaticamente quando o nome da classe e igual ao nome da tabela;o mesmo vale para os atributos que correspondem `as colunas da tabela. Destaforma quando solicitar ao JPA para salvar, consultar, alterar ou excluir umaentidade automaticamente sera criado o Script SQL para executar a opera cao.Estaclasse est aimplementandoainterface java.io.Serializableparainformar quepodeser serializadaetrafegadapelarededecomputadores.Quando as entidades fazem parte de uma aplica cao console ou desktop nao h anecessidadedeimplementarestainterface,an aoserqueaaplicac aoprecisetrafegar o objeto desta classe pela rede ou em algum HD. Quando implemen-tada esta interface tambem e preciso denir o atributo privatestaticnallongserialVersionUIDcomumn umerolongo, istoserveparaidenticaraclassequandooobjetofortrafegarviarede.Observacao: onomedastabelasnobancodedadosn aoecasesensitivequando o banco de dados e instalado no Windows, no caso do Linux j a e casesensitive.1.1.1 AnotacoesparaEntityAs entidades podem ser melhor detalhadas adicionando mais algumas anotacoesesuaspropriedades,estasanotac oespodeminformaraoJPAqueporexem-plo, uma entidade nao segue o padr ao de nome igual ao da tabela, ou que suatabelanobancotemumrelacionamentodeUm-Para-Muitoscomoutrata-bela, que a tabela utiliza um gerador de ID do tipo SEQUENCE para deniron umerodachaveprimariaeoutrasinformac oesqueveremosaseguir:Obrigatoriamente toda entidade do JPA precisa ter pelo menos as anotac oesjavax.persistence.Entityqueinformaqueeumatabeladobancodeda-dosejavax.persistence.Idqueinformaqual oatributoechaveprimariadatabela.javax.persistence.EntityUsado para denir que a classe e uma Entity, por padrao quando o nomeda Entity e igual ao nome da tabela o relacionamento e feito automaticamentepeloJPA.Aspropriedadesdaanotac ao@Entitys aolistadasnatabela1.javax.persistence.TableDene o nome da tabela no banco de dados. As propriedades da anotac ao@Tables aolistadasnatabela2.9Propriedade Descricaoname Informaonomedaentidade,porpadr aoonomedaen-tidadeenomedaclasse. Estenomeeutilizadoparareferenciaraentidadenaconsulta.Tabela1: [email protected] Descricaocatalog Ocatalogodatabela.name Onomedatabela.schema Oesquemadatabela.uniqueConstraints Regrasquepodemseradicionadasnatabela.Tabela2: Propriedadesdaanotacao@Table.javax.persistence.IdInformaoatributodaEntityquerepresentaachaveprimaria.javax.persistence.ColumnInforma as conguracoes de coluna da tabela, por padr ao quando o nomedo atributo da Entity e igual ao nome da coluna da tabela, o relacionamentoefeitoautomaticamentepeloJPA. Aspropriedadesdaanotacao@Columns aolistadasnatabela3.javax.persistence.SequenceGeneratorUtilizadopararepresentar umasequencianumericageradaatraves dobancodedados. Aspropriedadesdaanotac ao@SequenceGeneratorsaolis-tadasnatabela4.javax.persistence.GeneratedValueDeneaestrategiaparacriar oID, podeser tipoAUTO(incrementaautomaticamente1,2,3emsequencia)ouutilizandoumaSEQUENCE.Aspropriedadesdaanotacao@GeneratedValuesaolistadasnatabela5.javax.persistence.TemporalUtilizado para representar campos de Data e Hora, nesta anotac ao pode-mosdenirotipodedadoDATE,TIMEeTIMESTAMP.Aspropriedadesdaanotac ao@Temporals aolistadasnatabela6.javax.persistence.Transient10Propriedade DescricaocolumnDenition Denic aodotipodacoluna.insertable InformaseatabeladeveserincludanoSQLdeinsert,porpadrao etrue.length Tamanhodacoluna,porpadr ao e255.name Nomedatabelaquecontemest acoluna, sen aoforin-formadoacolunaassumeonomedatabeladaentity.nullable Informaseovalorpodesernull.precision Precis aodacolunadecimal.scale N umerode casas decimais, usadosomente emcolunacomn umerodecimal.table Nomedatabelaquecontemest acoluna, sen aoforin-formadoassumeonomedatabeladaentity.unique Informaseacoluna echave unica.updatable Informa se a coluna deve ser includa no SQL de update,porpadrao etrue.Tabela3: [email protected] Descricaoname Nome unicoparaogerador quepodeser referenciadopor umaoumais classes que pode ser utilizadoparagerarvaloresdechaveprimaria.allocationSize Aquantidade que ser a incrementada na sequence, opadr ao e50.initialValue Valorinicialdasequence.sequenceName Nomedasequencedobancodedados.Tabela4: [email protected] epersistente.1.1.2 ExemplodeEntityNesseexemploser acriadoumaentityparatabelaUsuarioaseguir:CREATE TABLEUsuari o (i d NUMBER( 10) NOT NULL PRIMARY KEY,nome VARCHAR2( 100) NOT NULL,11Propriedade Descricaogenerator Nomedogeradordachaveprimariaqueeespecicadona anotac ao @SequenceGenerator ou @TableGenerator.strategy Estrategiadegera caodechaveprimariaqueoservicodepersistenciaprecisausarparagerarachaveprima-ria. Seuvalor pode ser obtido atraves da enumja-vax.persistence.GenerationType, os valores podemserAUTO,IDENTITY,SEQUENCEouTABLE.Tabela5: [email protected] Descricaovalue O tipo usado para mapear java.util.Date ejava.util.Calendar. Seuvalor pode ser obtidoatravesda enumjavax.persistence.TemporalType, os valorespodemserDATE,TIMEeTIMESTAMP.Tabela6: [email protected] DATE NOT NULL,emai l VARCHAR2( 150) NOT NULL,at i vo NUMBER( 1) NOT NULL,comentari o VARCHAR2( 200)) ;CrieaEntitypararepresentaratabelaUsuario:package pbc . j pa . exemplo1 . e nt i t y ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Date ;import j avax . pe r s i s t e nc e . Column ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . Temporal ;import j avax . pe r s i s t e nc e . TemporalType ;/12 Ent i dade u t i l i z a d a para r epr es ent ar umUsuari o ./@Entitypublic cl ass Usuari o implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=8762515448728066246L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;@Column( nul l a bl e =f al se )private St r i ng nome ;@Temporal ( TemporalType .DATE)@Column( name=dataNasc , nul l a bl e =f al se )private Date dataNasci mento ;@Column( nul l a bl e =f al se )private St r i ng emai l ;@Column( nul l a bl e =f al se )private Bool ean at i vo ;private St r i ng comentari o ;public Bool ean getAti vo ( ) { return at i vo ; }public void s et At i vo ( Bool ean at i vo ) {thi s . at i vo =at i vo ;}public St r i ng getComentari o ( ) { return comentari o ; }public void setComentari o ( St r i ng comentari o ) {thi s . comentari o =comentari o ;}public Date getDataNasci mento ( ) {return dataNasci mento ;}public void setDataNasci mento ( Date dataNasci mento ) {thi s . dataNasci mento =dataNasci mento ;}13public St r i ng getEmai l ( ) { return emai l ; }public void setEmai l ( St r i ng emai l ) {thi s . emai l =emai l ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }}Foi utilizadaaanotac ao@EntityparainformarqueaclasseUsuarioeumaentidadedobancodedados; tambemfoi denidoqueapropriedadeLongid ser a o ID da tabela atraves da anota cao @Id e e informado que seuvalor ser a gerado automaticamente com a anotac ao @GeneratedValue. Pormeio da anotac ao @Column e especicado quais os atributos n ao podem sernullequeoatributoDatedataNascimentoest amapeadoparaacolunadataNascdatabelaUsuario.1.2 EntityManagerOEntityManagereumservicoresponsavel porgerenciarasentidades. Pormeiodeleepossvel gerenciarociclodevidadasentidades, aoperacaodesincronizac ao com a base de dados (inserir, atualizar ou remover), a consultadeentidades,entreoutrasoperac oes.Quando uma entidade est a associada a um EntityManager, esta entidadeest anocontextoemque pode ser persistida, emque todas as operacoesrealizadasnoobjetodaentidadeereetidonobancodedados. Todasasidentidadesdasentidadess ao unicas, portantoparacadaregistronobancodedadoshaveraapenasumareferencianocontextodoEntityManager.OEntityManagerpodesergerenciadodeduasformas:GerenciadopeloContainer;GerenciadopelaAplica cao.141.2.1 UnidadedePersistenciaA unidade de persistencia e utilizada para congurar as informa coes referen-tesaoprovedordoJPA(implementa caodaespecicac aoJPA)eaobancodedados;tambem epossvelidenticarasclassesqueser aomapeadascomoentidadesdobancodedados.Para denir a unidade de persistencia e necessario um arquivo XML cha-madopersistence.xml,quedevesercriadonapastaMETA-INFdopro-jeto. Por meiodeste arquivoe possvel denir quantas unidades de per-sistenciafornecess ariasparaoprojeto. ExemplodeunidadedepersistenciamapeadoparaumbancodedadosOracle:

org . hi ber nat e . ej b . Hi be r nat e Pe r s i s t e nc epbc . j pa .e x e r c i c i o 1. modelo . Li vro

Neste arquivo persistence.xml a tag dene a uni-dade de persistencia, e na propriedade name qual seu nome (utilizado quandoumEntityManager ecriado pormeio doEntityManagerFactory nocontextoJavaSEouquandoerealizadoinje caodedependenciaatravesdaanotacaojavax.persistence.PersistenceUnit no contexto Java EE). A propriedadetransaction-typeinformaqualotipodetransa cao(RESOURCELOCALouJTA). Seaaplicac aoeJavaSE, ent ao, utilizeotipodetransac aoRE-SOURCELOCAL, assimprogramaticamente sao criadas as transa coescomobancodedados enaaplica caoJavaEEutilizeoJTAqueacessaumpooldeconexoesemumservidorweb.Em uma unidade de persistencia utilize a tag para informarqualaAPIqueforneceraumaimplementac aodoJPA.Emumaaplicac aoJavaSEe necessarioinformar quais as classes s aoentidadesdobancodedadosatravesdatagetambeminformarquaisaspropriedadesnecess ariasparaencontrarobancodedadosatravesdatag .Nas aplicacoes Java EEe possvel criar umpool de conexoes comobancodedados noservidor web; nestecasoeaconselhadoutilizar otipodetransac aoJavaTransactionAPI(JTA)queefornecidapelocontai-nerEJB. Tambemeutilizadaatagparainformarafonte do pool de conexoes (nome JNDI). Exemplo de persistence.xml paraaplicac oesJavaEE:

16

org . hi ber nat e . ej b . Hi be r nat e Pe r s i s t e nc ej dbc /ExemplosJPA

1.2.2 CriandoumaunidadedepersistencianoNetBeansONetBeanspossui umaformamaissimplesdecria caodaunidadedeper-sistencia. Cliquecomobotaodireitonoprojetoeselecioneaopc aoNovo->Outro..., na tela de Novo arquivo selecione a categoria Persistence e otipodearquivoUnidadedePersistencia,conformeagura4.CliqueemProximo> paradeniraspropriedadesdobancodedados.NateladeProvedorebancodedadosdigiteumnomeparaaunidadedepersistencia, escolhaqual abibliotecadepersistencia, denaaconexaocomobancodedadosequalaestrategiaparagerac aodetabelas,conformeagura5.-OArquivosdaUnidadedePersistenciaeutilizadoquandoaEn-tityManagerecriada. PormeiodestenomeoEntityManagerencontrar aascongurac oesdobancodedados.- O Provedor de Persistencia e a implementa cao do JPA utilizada paraacessar o banco de dados; neste exemplo e utilizado o framework Hibernate(JPA2.0).- Fontededados e a forma como ser a realizada a conexao com o bancodedados. Podeserfeitodeduasmaneiras, criadaumaconex aodiretanaaplicac aooucriadoumpooldeconexoesnoservidor.Para criar uma nova conexao direta na aplica cao clique na caixa de sele caoFonte de Dadoseescolhaaopc aoNovafonte de dados..., conformeapresentadonaFigura6.Na tela de Criarfontededados informe um NomeJNDI. Esse nomee usadoparareferenciar aconex aoe tambemumaConexao de banco17Figura4: CriarumaunidadedepersistencianoNetBeans.dedados. Casoaindan aotenhaumaconex aocriada, escolhanacaixadeselec aoConex aodebancodedadosaopc aoNovaConexaodeBancodeDados...,conformeapresentadonaFigura7.Na tela Assistente de Nova Conexao escolha o Driver chamado Ora-cleThin,conformeapresentadonaFigura8.Na primeira vez que ele e usado e preciso especicar o driver do banco dedados Oracle. Clique em Adicionar e escolha o driver ojdbc6.jar,conformeaFigura10.CliqueemProximoparacontinuaracriacaodaconex ao. Continuandoacriac ao da Nova Conexao escolha o NomedoDriver,dena o Host(IP),Porta,IDdoServico,NomedousuarioeSenha,conformeoexemplodaFigura11:CliqueemTestar Conexaocasoqueiravalidar seas informac oes daconex aoest aocorretas, depoiscliqueemPr oximoparacontinuaredepoiscliqueemFinalizarparaterminaracriac aodaconex ao.18Figura5: Deniroprovedorefontededados.Figura6: Criandoumanovafontededados.Duranteodesenvolvimentodeumaaplicac aowebqueacessabancodedados, podeser utilizadoumpool deconexoes queecriadopelopr oprioservidordeaplica coesweb, aoinvesdecriarumaconexaocomobancode dadosdiretonaaplicac aoenecess ariocriar umpool deconex oes noservidoredepoisescolhernaFontededados,conformeagura11.Nesteexemploser aescolhidaumaFontedeDadosquefoicriadanoser-vidorGlassFish.AEstrategiadegerac aodetabelaspermite:19Figura7: Criandoumanovaconex aodebancodedados.Figura8: Denindoodriverdobancodedados.Criar-oJPAcriaaestruturadetabelasnobancodedados;Apagarecriar o JPA apaga a estrutura existente e cria uma estru-turanovadastabelasdobancodedados;Nenhumcriarmanualmenteastabelasdobancodedados.Depois de criadaaunidade de persistencia, conforme apresentadonagura12,notequeesta eumaversaovisualdoarquivopersistence.xml.Este e o arquivo persistence.xml criado na pasta META-INF do pro-jeto:

org . hi ber nat e . ej b . Hi be r nat e Pe r s i s t e nc ej dbc / Oracl e

ParautilizaroHibernateenecess arioadicionarsuasbibliotecasnopro-jeto. Para fazer isso clique com o bot ao direito no projeto e selecione a op caoPropriedades, nestatelaselecioneacategoriaBibliotecas, ap osissocli-quenobot aoAdicionarbiblioteca... eadicioneasbibliotecasJPAdoHibernate,conformeagura13.21Figura10: Criarumanovaconex aodobancodedados.1.2.3 EntityManagergerenciadopelaAplicacaoNasaplicac oesJavaSEenecess ariocontrolarpelaaplicac aocomodevesercriadooEntityManager,paraissoprecisamosfazerosseguintespassos:1)Utilizandoaclassejavax.persistence.PersistencepodemosutilizarometodocreateEntityManagerFactory()querecebecomoparametroonomedaunidadedepersistencia(queveremos mais adiante) quecontemasinformac oessobreobancodedadosparacriarumajavax.persistence.EntityManagerFactory.Enti tyManagerFactory f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory ( UnitName ) ;2) Atraves do javax.persistence.EntityManagerFactory podemos uti-lizarometodocreateEntityManager()paraobtermosumaEntityMana-22Figura11: Escolhendoumafontededadosj aexistente.ger.Enti tyManager enti tyManager =f ac t or y . createEnti tyManager ( ) ;Exemplo:package pbc . j pa . exemplo . dao ;import j avax . pe r s i s t e nc e . Enti tyManager ;import j avax . pe r s i s t e nc e . Enti tyManagerFactory ;import j avax . pe r s i s t e nc e . Pe r s i s t e nc e ;/ Cl asse u t i l i z a d a para f az e r r e a l i z a r as opera co es de banco de dados s obre a e nt i t y Li vro ./public cl ass DAO {private Enti tyManager enti tyManager ;23Figura12: Visualizacaodapersistence.xml.public Enti tyManager getEnti tyManager ( ) {Enti tyManagerFactory f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory ( ExemplosJPAPU ) ;enti tyManager =f ac t or y . createEnti tyManager ( ) ;f ac t or y . c l o s e( ) ;}}NoexemplodentrodometodogetEntityManager()criamosumEn-tityManagerFactorydaunidadedepersistenciaExemplosJPAPU(cri-adanoitem1.2.3)atravesdaclassePersistence, depoiscriamosumEn-tityManager a partir da factory. Quando terminamos de utilizar a Entity-ManagerFactoryeimportantechamarometodoclose()paraliberarosrecursosdafactory.24Figura13: AdicionarabibliotecaJPAdoHibernatenaaplicac ao.1.2.4 EntityManagergerenciadopeloContainerNo desenvolvimento de aplicac oes Java EE e possvel deixar o conteiner EJBinjetar aunidadedepersistenciaatravesdaanotac aojavax.persistence.PersistenceContext.package pbc . j pa . exemplo . ej b ;import j avax . ej b .St a t e l e s s;import j avax . pe r s i s t e nc e . Enti tyManager ;/ EJB u t i l i z a d o para demonstrar o uso da i nj e cao de25 depende nci a do EntityManager ./@St at el es spublic cl ass ExemploBean implements ExemploRemote {@Persi stenceContext ( unitName =ExercicioJPA1PU )private Enti tyManager enti tyManager ;}Este exemplomostraumcomponente SessionBeanStateless que uti-liza a anotac ao @PersistenceContext para adicionar uma unidade de per-sistencianoEntityManager. ReparequenaoeprecisocriarmanualmenteaEntityManager, poisocontainerEJBseencarregadefazerissoetambematribui seu objeto para a vari avel com a anotac ao. A anotacao @Persisten-ceContextpossuioatributounitNameparainformarqueonomedauni-dadedepersistenciaeExemplosJPAPU, denidonatag doarquivopersistence.xml.1.2.5 InterfaceEntityManagerA interface javax.persistence.EntityManager possui a assinatura de metodosmanipularasentidades,executarconsultaseoutros:publicvoidpersist(Objectentity);Fazumanovainst anciagerenciavelepersistivel.enti tyManager .p e r s i s t ( pessoa ) ;Neste exemplo o metodo persist da EntityManager salva a entidade Pes-soanobancodedados.publicTmerge(Tentity);JuntaoestadodaEntitycomoestadopersistido,porexemplo:enti tyManager . merge ( pessoa ) ;NesteexemploometodomergedaEntityManageratualizaaentidadePessoanobancodedados.publicvoidremove(Objectentity);26RemoveainstanciadaEntitydobancodedados,porexemplo:enti tyManager . remove ( pessoa ) ;Neste exemplo o metodo remove da EntityManager exclui a entidade Pes-soanobancodedados.publicbooleancontains(Objectentity);VericaseainstanciadaEntityestaemumestadopersistvel.public T nd(Class entityClass,Object primaryKey);Procuraumregistronobancodedados atraves daEntityeid(chaveprim aria)databela,cason aoencontreretornanull,porexemplo:Pessoa pessoa =enti tyManager . f i nd ( Pessoa . cl ass, i d ) ;NesteexemploometodonddaEntityManagerpesquisaumaentidadepelasuaclasseeachaveprim aria.publicTgetReference(ClassentityClass, Objectpri-maryKey);ProcuraumregistronobancodedadosatravesdaEntityeiddatabela,caso n ao encontre retorna uma exce cao javax.persistence.EntityNotFoundException.publicvoidush();Os metodos persist(), merge() e remove() aguardama nalizac ao datransac aoparasincronizar as entidades comobancodedados, ometodoush()forcaestasincronizac aonomomentoemque echamado.publicvoidrefresh(Objectentity);Vericasehouvealgumaalteracaonobancodedadosparasincronizarcomaentidade.publicvoidclear();Removeasentidadesqueestaonoestadogerenci avel dentrodaEntity-Manager.publicvoidclose();Fechaaconex aodoEntityManager.27publicbooleanisOpen();VericaseoEntityManagerestacomaconex aoaberta.publicEntityTransactiongetTransaction();Obtem uma javax.persistence.EntityTransaction que e uma transac aocomobancodedados.1.2.6 CiclodevidadaEntityUmaentidadedobancodedadospodepassarporquatroestadosdiferen-tesquefazempartedoseuciclodevida: novo, gerenci avel, desacopladoeremovido,conformeagura14.Figura 14: Ciclo de vida da entidade adaptado de BROSE, G.; SILVERMAN,M.;SRIGANESH,R.P.(2006,p.180)Novo(new)AEntityfoi criada, mas aindanaofoi persistidanobancode dados.Mudancas no estado da Entity nao sao sincronizadas com o banco de dados.Gerenciado(managed)AEntityfoi persistidanobancodedadoseencontra-seemumestadogerenci avel. MudancasnoestadodaEntitys aosincronizadascomobancodedadosassimqueumatransa caofornalizadacomsucesso.Removido(removed)28AEntityfoi agendadaparaser removidadabasededados, estaenti-dadeseraremovidasicamentedobancodedadosquandoatransac aofornalizadacomsucesso.Desacoplado(detached)A Entity foi persistida no banco de dados, mas encontra-se em um estadoque n ao est a associada ao contexto persistvel, portanto as alterac oes em seuestadonaos aoreetidasnabasededados.1.3 ExemplodeDAO(CRUD)utilizandoJPANesseexemplo,vamoscriarumaaplicativoJava(console)chamadoExem-plo, parasalvar, alterar, consultarporideapagarumregistrodepessoa,utilizaremosobancodedadosOracle.Observacao: Lembre de adicionar as bibliotecas do Hibernate JPA e Ora-cle(ojdbc6.jar)noseuprojeto.VamoscriarumaEntitypararepresentaratabelaPessoaaseguir:CREATESEQUENCEPESSOA SEQINCREMENTBY1STARTWITH1 NOCACHENOCYCLE;CREATE TABLEPessoa (i d NUMBER( 5) NOT NULL,nome VARCHAR2( 100) NOT NULL,dataNasc DATE NOT NULL,emai l VARCHAR2( 150) ,PRIMARYKEY( ID)) ;CriandoaentitypararepresentaratabelaPessoa:package pbc . j pa . exemplo1 . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Date ;import j avax . pe r s i s t e nc e . Column ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . SequenceGenerator ;29import j avax . pe r s i s t e nc e . Temporal ;import j avax . pe r s i s t e nc e . TemporalType ;/ Cl asse u t i l i z a d a para r epr es ent ar uma pessoa ./@Entity@SequenceGenerator ( name=PESSEQ ,sequenceName=PESSOA SEQ , a l l o c a t i o nSi z e =1,i ni t i a l Va l ue =1)public cl ass Pessoa implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=1L;@Id@GeneratedValue ( s t r at e gy=Generati onType .SEQUENCE,gener at or=PESSEQ )private Long i d ;@Column( nul l a bl e =f al se )private St r i ng nome ;@Temporal ( TemporalType .DATE)@Column( name =dataNasc , nul l a bl e =f al se )private Date dataNasci mento ;private St r i ng emai l ;public Date getDataNasci mento ( ) {return dataNasci mento ;}public void setDataNasci mento ( Date dataNasci mento ) {thi s . dataNasci mento =dataNasci mento ;}public St r i ng getEmai l ( ) { return emai l ; }public void setEmai l ( St r i ng emai l ) {thi s . emai l =emai l ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }30public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }}Vamos criar oarquivopersistence.xml, ONetBeans possui umwizardque permite de formafacil acria caodestaunidade de persistencia, paraisto, cliquecomobot aodireitodomousenonomedoprojeto, selecioneaopc aoNovo->Outro..., nateladeNovoarquivoselecioneacategoriaPersistenceeotipodearquivoUnidadedePersistencia.NateladeNovoUnidadedepersistencia,informe:Nomedaunidadedepersistencia: ExemplosJPAPUBibliotecadepersistencia: HibernateJPA(1.0)Conexaocomobancodedados: Aqui vamoscriarumanovaco-nex aocomoOracle, ent aoselecione aopc aoNova conexao combancodedados...Na tela Nova Conexao do Banco de Dados, selecione no campoNomedodriveraopc aoNovodriver...Na tela de NovodriverJDBC, clique em Adicionar... e procure peloarquivocomodriverdoOracle, nestecasooarquivoojdbc6.jar. Ap osissocliqueemOKparaprosseguir.VoltandonatelaNovaConexaodoBancodeDados, congureasseguintesinformac oes:Mododeentradadedados: EntradadiretadeURLNomedousuario: Informeseuusu arioSenhadousuario: InformesuasenhaURLJDBC:ParaconectarnobancodedadosdafaculdadeutilizeaURL:j dbc : or ac l e : t hi n : @l ocal hos t : 1521:XEou31j dbc : or ac l e : t hi n :@(DESCRIPTION=(ADDRESSLIST=(ADDRESS=(PROTOCOL=TCP) (HOST=10. 20. 250. 13)(PORT=1521)))(CONNECTDATA=(SERVICE NAME=DBFACET) ) ) )CliqueemOKparaprosseguir, aconexaocomobancodedados seratestadaeapresentar aamensagemnatelaConexaoestabelecida. CliqueemOKparaprosseguir.AoclicaremFinalizarserageradooarquivopersistence.xml.

org . hi ber nat e . ej b . Hi be r nat e Pe r s i s t e nc epbc . j pa . exemplo1 . modelo . Pessoa

Vamos criar uma classe PessoaDAO que possui os metodos para manipu-lar(salvar,atualizar,apagareconsultarporid)umobjetoPessoa.package pbc . j pa . exemplo . dao ;import j avax . pe r s i s t e nc e . Enti tyManager ;import j avax . pe r s i s t e nc e . Enti tyManagerFactory ;import j avax . pe r s i s t e nc e . Pe r s i s t e nc e ;import pbc . j pa . exemplo . modelo . Pessoa ;/ Cl asse u t i l i z a d a para f az e r r e a l i z a r as opera co es de banco de dados s obre a e nt i t y Pessoa ./public cl ass PessoaDAO{/Me t odo u t i l i z a d o para obt er o e nt i t y manager . @return/private Enti tyManager getEnti tyManager ( ) {Enti tyManagerFactory f ac t or y =nul l ;Enti tyManager enti tyManager =nul l ;try {//Obt emo f ac t or y a p a r t i r da uni dade de p e r s i s t e nci a .f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory( ExemplosJPAPU ) ;//Cria um e nt i t y manager .enti tyManager =f ac t or y . createEnti tyManager ( ) ;//Fecha o f ac t or y para l i b e r a r os r ecur s os u t i l i z a d o.} f i nal l y {f ac t or y . c l o s e( ) ;}33return enti tyManager ;}/Me t odo u t i l i z a d o para s al v ar ou a t u a l i z a r as i nf orma co es de uma pessoa . @param pessoa @return @throws j ava . l ang . Except i on/public Pessoa s al var ( Pessoa pessoa ) throws Excepti on {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;System . out . pr i nt l n ( Sal vando a pessoa . ) ;/ Ve r i f i c a se a pessoa ai nda nao e s t a s al v ano banco de dados . /i f ( pessoa . get I d ( ) ==nul l ) {enti tyManager .p e r s i s t ( pessoa ) ;} el se {pessoa =enti tyManager . merge ( pessoa ) ;}// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return pessoa ;}/Me t odo que apaga a pessoa do banco de dados . @param i d/public void e x c l ui r ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {34// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;/ Consul t a a pessoa na base de dados at r av e sdo seu ID. /Pessoa pessoa =cons ul t ar Por I d ( i d ) ;System . out . pr i nt l n ( Excl ui ndo a pessoa : +pessoa . getNome ( ) ) ;// Remove a pessoa da base de dados .enti tyManager . remove ( pessoa ) ;// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}}/ Consul t a o pessoa pel o ID. @param i d @return o ob j e t o Pessoa ./public Pessoa cons ul t ar Por I d ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;Pessoa pessoa =nul l ;try {pessoa =enti tyManager . f i nd ( Pessoa . cl ass, i d ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return pessoa ;}}OmetodosalvarrecebeoobjetoPessoaqueserasalvo,nesteexemplousaremos estemetodosalvarumanovapessoaouatualizaros dados deumanovapessoa.Mas como sabemos quando temos que salvar e quando tem que atualizar,35basta olhar o atributo id da classe Pessoa,se o id for null signica que e umnovoobjetoqueaindanaofoi salvonobancodedados, entaoutilizaremosometodopersistdaEntityManagerparasalva-lo, casooidtenhaalgumvalor ent ao signica que o objeto j a foi salvo anteriormente portanto ele deveseratualizadoentaoutilizaremosometodomergedaEntityManagerparaatualiza-lo.Note que como vamos salvar ou atualizar os dados, precisamos criar umatransac ao, com o metodo getTransaction() do EntityManager obtemos umobjetoEntityTransactioncomelepodemosiniciaratransac aoatravesdometodo begin(), nalizar a transac ao com sucesso atraves do metodo com-mit()oudesfazerasaltera coesemcasodeerrocomometodorolback().Estemesmoconceitodetransac aoser autilizadonometodoexcluir.Ometodoexcluirn aoprecisarecebertodososdadosdaPessoa, rece-bendoapenasoseuIDatravesdopar ametroLongid, podemosutilizarometodonddoEntityManagerparaconsultar os dados daPessoa, de-poiscomoobjetoPessoaconsultadopodemosusar ometodoremovedoEntityManagerparaapagarosdadosdaPessoa.OmetodoconsultarPorIdrecebeumobjetoLongchamadoid,comoID da tabela Pessoa, utilizando o metodo nd do EntityManager passamosaclassedaentidadePessoa.classeseuidparaquepossamosconsultarosdadosdaPessoa.VamoscriarumaclassePessoaDAOTesteparatestarmososmetodosdaclassePessoaDAO:package pbc . j pa . exemplo1 . t e s t e ;import j ava .u t i l. Cal endar ;import j ava .u t i l. Gregori anCal endar ;import pbc . j pa . exemplo1 . dao . PessoaDAO;import pbc . j pa . exemplo1 . modelo . Pessoa ;/ Cl asse u t i l i z a d a para t e s t a r os me t odos do PessoaDAO./public cl ass PessoaDAOTeste {public stati c void main( St r i ng[ ] ar gs ) throws Excepti on {Pessoa pessoa =newPessoa ( ) ;pessoa . s e t I d (1L) ;36pessoa . setNome ( Raf ael Sakurai ) ;Cal endar data =newGregori anCal endar ( ) ;data . s e t ( Cal endar .YEAR, 1983) ;data . s e t ( Cal endar .MONTH, 11) ;data . s e t ( Cal endar .DAYOF MONTH, 26) ;pessoa . setDataNasci mento ( data . getTime ( ) ) ;pessoa . setEmai l ( r a f a e l. sakurai @metodi sta . br ) ;PessoaDAO dao =newPessoaDAO ( ) ;System . out . pr i nt l n ( Sal vando a pessoa : +pessoa . getNome ( ) ) ;pessoa =dao . s al var ( pessoa ) ;pessoa . setNome ( Raf ael Guimar a es Sakurai ) ;pessoa =dao . s al var ( pessoa ) ;System . out . pr i nt l n ( Al terando a pessoa : +pessoa . getNome ( ) ) ;Pessoa pessoa2 =dao . cons ul t ar Por I d ( pessoa . get I d ( ) ) ;System . out . pr i nt l n ( Consul tando : +pessoa2 . getNome ( ) ) ;System . out . pr i nt l n ( Removendo a pessoa : +pessoa . get I d ( ) ) ;dao .e x c l ui r ( pessoa . get I d ( ) ) ;}}Nestetestevamoscriarumobjetopessoaesalva-lo,depoisvamosalteraonomedapessoa,vamosconsultarapessoapeloidenonalvamosapagaroregistrodapessoa.1.4 ExercciosExerccio1Nesteexercciovamosabordarcomocriarumaaplicac aoCRUD(salvar,alterar,consultareexcluir)doLivroutilizandooJavaPersistenceAPI.Crieoseguintebancodedados:CREATESEQUENCELIVRO SEQINCREMENTBY137STARTWITH1 NOCACHENOCYCLE;CREATE TABLELi vro (i d number( 5) NOT NULL,t i t u l o varchar2( 200) NOT NULL,autor varchar2( 200) NOT NULL,i s bn varchar2( 50) NOT NULL,pagi nas number( 5) NOT NULL,preco number( 10 , 2) NOT NULL,PRIMARYKEY( i d )) ;CrieumProjetoJavachamadoExercicioJPA1,adicioneasbibliotecasHibernateJPAeDriverdaOracle(ojdbc6.jar)ecrie:- Uma classe entity para representar um Livro com os atributos id, titulo,autor,isbn,paginasepreco.package pbc . j pa .e x e r c i c i o 1. modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Column ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . SequenceGenerator ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . SequenceGenerator ;/ Cl asse u t i l i z a d a para r epr es ent ar uma Ent i t y Li vro . @author Raf ael Guimara es Sakurai/@Entity@SequenceGenerator ( name =LIVRO SEQ ,sequenceName =LIVRO SEQ , i ni t i a l Va l ue =1 ,a l l o c a t i o nSi z e =1)public cl ass Li vro implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=2405106626392673061L;38@Id@GeneratedValue ( s t r at e gy =Generati onType .SEQUENCE,gener at or =LIVRO SEQ )@Column( nul l a bl e =f al se )private Long i d ;@Column( nul l a bl e =f al se )private St r i ng t i t u l o;@Column( nul l a bl e =f al se )private St r i ng autor ;@Column( nul l a bl e =f al se )private St r i ng i s bn ;@Column( nul l a bl e =f al se )private I nt e ge r pagi nas ;@Column( nul l a bl e =f al se )private Double preco ;public St r i ng getAutor ( ) { return autor ; }public void setAutor ( St r i ng autor ) {thi s . autor =autor ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng get I s bn ( ) { return i s bn ; }public void s e t I s bn ( St r i ng i s bn ) { thi s . i s bn =i s bn ; }public I nt e ge r getPagi nas ( ) { return pagi nas ; }public void s et Pagi nas ( I nt e ge r pagi nas ) {thi s . pagi nas =pagi nas ;}public Double getPreco ( ) { return preco ; }public void s et Pr eco ( Double preco ) {thi s . preco =preco ;}39public St r i ng ge t Ti t ul o ( ) { return t i t u l o; }public void s e t Ti t ul o ( St r i ng t i t u l o ) {thi s .t i t u l o = t i t u l o;}}-CrieumaclasseLivroDAOcomosseguintesmetodos:getEntityManager()quecriaumEntityManagersalvar()chameometododoEntityManagerquerealizeaoperac aodesalvaroualterarumlivro.consultarPorId()chameometododoEntityManager querealizeaoperac aodeconsultarpassandooatributodachaveprimaria.excluir() chame o metodo do EntityManager que realize a operac ao deremoverumlivro.package pbc . j pa .e x e r c i c i o 1. dao ;import j avax . pe r s i s t e nc e . Enti tyManager ;import j avax . pe r s i s t e nc e . Enti tyManagerFactory ;import j avax . pe r s i s t e nc e . Pe r s i s t e nc e ;import pbc . j pa .e x e r c i c i o 1. modelo . Li vro ;/ Cl asse u t i l i z a d a para f az e r r e a l i z a r as opera co es de banco de dados s obre a e nt i t y Li vro ./public cl ass LivroDAO{/Me t odo u t i l i z a d o para obt er o e nt i t y manager . @return/private Enti tyManager getEnti tyManager ( ) {Enti tyManagerFactory f ac t or y =nul l ;Enti tyManager enti tyManager =nul l ;try {//Obt emo f ac t or y a p a r t i r da uni dade de p e r s i s t e nci a .f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory( ExercicioJPA1PU ) ;40//Cria um e nt i t y manager .enti tyManager =f ac t or y . createEnti tyManager ( ) ;//Fecha o f ac t or y para l i b e r a r os r ecur s os u t i l i z a d o.} f i nal l y {f ac t or y . c l o s e( ) ;}return enti tyManager ;}/Me t odo u t i l i z a d o para s al v ar ou a t u a l i z a r as i nf orma co es de um l i v r o. @param l i v r o @return @throws j ava . l ang . Except i on/public Li vro s al var ( Li vro l i v r o ) throws Excepti on {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;System . out . pr i nt l n ( Sal vando o l i v r o. ) ;/ Ve r i f i c a se o l i v r o ai nda nao e s t a s al v ono banco de dados . /i f ( l i v r o. get I d ( ) ==nul l ) {enti tyManager .p e r s i s t ( l i v r o) ;} el se {l i v r o =enti tyManager . merge ( l i v r o) ;}// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return l i v r o;}/41Me t odo que e x c l ui o l i v r o do banco de dados . @param i d/public void e x c l ui r ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;// Consul t a o l i v r o na base de dados at r av e s do seu ID.Li vro l i v r o =enti tyManager . f i nd ( Li vro . cl ass, i d ) ;System . out . pr i nt l n ( Excl ui ndo o l i v r o: + l i v r o. ge t Ti t ul o( ) ) ;// Remove o l i v r o da base de dados .enti tyManager . remove ( l i v r o) ;// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}}/ Consul t a o l i v r o pel o ID. @param i d @return/public Li vro cons ul t ar Por I d ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;Li vro l i v r o =nul l ;try {l i v r o =enti tyManager . f i nd ( Li vro . cl ass, i d ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return l i v r o;}}42Vamos criar um arquivo persistence.xml dentro da pasta META-INFparaguardarasconguracoesdobancodedados. NestearquivotambemvamosinformaraEntityLivro.

org . hi ber nat e . ej b . Hi be r nat e Pe r s i s t e nc epbc . j pa .e x e r c i c i o 1. modelo . Li vro

43Paratestar as opera coes sobre aentidade Livro, vamos criar aclasseLivroTestequeutilizaoLivroDAOparafazerusodaEntityManagerparagerenciaraentityLivro.package pbc . j pa .e x e r c i c i o 1. t e s t e ;import pbc . j pa .e x e r c i c i o 1. dao . LivroDAO;import pbc . j pa .e x e r c i c i o 1. modelo . Li vro ;/ Cl asse u t i l i z a d a para t e s t a r a p e r s i s t e nci a da e nt i t y Li vro ./public cl ass Li vr oTest e {public stati c void main( St r i ng[ ] ar gs ) {try {Li vro l i v r o =newLi vro ( ) ;l i v r o. setAutor ( Raf ael Guimar a es Sakurai ) ;l i v r o. s e t I s bn ( 1111111111111 ) ;l i v r o. s et Pagi nas ( 439) ;l i v r o. s et Pr eco ( 3 0 . 9 0 ) ;l i v r o. s e t Ti t ul o ( Guia de es t udos SCJA. ) ;LivroDAO dao =newLivroDAO ( ) ;l i v r o =dao . s al var ( l i v r o) ;System . out . pr i nt l n ( ID do l i v r o s al vo : + l i v r o. get I d ( ) ) ;/ PARAFAZER Test e a cons ul t a, a l t e r a cao e e x c l us ao do l i v r o./} catch ( Excepti on ex ) {ex . pr i nt St ackTr ace ( ) ;}}}Exerccio244Crieumaaplica caoSwingutilizandoJPAparafazer oCRUD(salvar,alterar,consultareexcluir)databelaProdutoaseguir:CREATE TABLEProduto (i d number( 5) NOT NULL PRIMARY KEY,nome varchar2( 200) NOT NULL,preco number( 10 , 2) NOT NULL,dataVal i dade date ,qtdEstoque number( 5)) ;Exerccio3Crie uma aplicacao Swing ou Console utilizando o JPA para fazer o CRUD(salvar,consultar,alterareexcluir)deduasentidadesasuaescolha.452 ChaveprimariaAte o momento vimos como criar uma chave primaria utilizando a estrategiaGenerationType.AUTOquegeraautomaticamenteumID, nessasessaovamosveralgumasoutrasformasdegerac aodachaveprimaria.2.1 EstrategiadeSEQUENCEparagerarIDObancode dados Oracle possui umtipode objetoque pode ser criadointernamentechamadoSEQUENCE(sequencia) equepodeser associadoaumcontador. Cadavezqueoseuproximovaloresolicitadoocorreumincrementodestevalor. Paragerar oIDdaentidadeepossvel utilizar aestrategiadeSEQUENCEtambem,associandoasequenciacriadanobancodedadoscomogeradordeID.Noexemplo, aseguir, seracriadaumaentidade que utilizaumaSE-QUENCEparagerar oidreferenteachaveprim ariadatabela. Primeiroser acriadaasequenciaUSUARIOSEQnobancodedados:CREATESEQUENCEUSUARIO SEQINCREMENTBY1STARTWITH1 NOCACHENOCYCLE;Aseguir,crieaentidadeUsuarioqueutilizar aest asequenciaparageraroID.package pbc . j pa . exemplo . sequence . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . SequenceGenerator ;import j avax . pe r s i s t e nc e . Tabl e ;/ Cl asse u t i l i z a d a para demonstrar o uso da SEQUENCE./@Entity@Table ( name =USUARIO )@SequenceGenerator ( name=USU SEQ , sequenceName=USUARIO SEQ ,46i ni t i a l Va l ue =1, a l l o c a t i o nSi z e =1)public cl ass Usuari o implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=4023522856316087762L;@Id@GeneratedValue ( s t r at e gy =Generati onType .SEQUENCE,gener at or =USU SEQ )private Long i d ;private St r i ng nome ;public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }}A anotac ao @SequenceGenerator vai indicar qual a sequencia do bancodedados,qualovalorinicialeaquantidadequeestasequencia eincremen-tada.name=informaoapelidodasequenceexemploUSUSEQ;sequenceName=informaonomedasequenciacriadanobancodedados,porexemplo: USUARIOSEQ;initialValue=informaovalorinicialdasequencia,porexemplo: 1;allocationSize =informa a quantidade que ser a incrementada nasequencia,opadr ao(default) e50,nesteexemplofoidenidoqueseraincrementadode1em1.Aanotac ao@GeneratedValuenessecasoestausandoaestrategiadeSEQUENCE entao ele vai procurar a sequencia que tem o apelido USUSEQefazumconsultanobancoparapegarseuresultado:SELECTUSUARIO SEQ.NEXTVAL FROM DUAL;strategy = informa o tipo de estrategia que ser a utilizado nesse exem-ploGenerationType.SEQUENCE;47generator = informa o apelido da sequence nesse exemplo USUSEQ.2.2 UtilizandochavecompostaAchavecompostadenequev ariosatributosser aoutilizadosparadenirachavedeumaentidade, comisso, acabamostendoumarestric aoondeosatributosdachavecompostan aopodemserrepetidos.No JPA quando precisamos denir uma chave composta precisamos criaruma classe separada apenas com os atributos que fazem parte da chave com-postaeprecisamosutilizaraanota caojavax.persistence.Embeddable.NesteexemplovamoscriarumaentidadeTelefonequepossuiumachavecompostapelos atributos ddde n umerodotelefone, pois n aopode ter omesmon umerodetelefoneparamaisde1cliente.ParadeclararachavecompostavamoscriarumaclassechamadaTelefo-nePKcomosatributosdddenumero:package pbc . j pa . exemplo . chave . composta . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Embeddable ;/ Esta c l a s s e r epr es ent a a composi cao da chave do t e l e f one, e s t a chave e composta por ddd +numero do t e l e f o ne ./@Embeddablepublic cl ass TelefonePK implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=637018809489152388L;private Short ddd ;private St r i ng numero ;public Short getDdd ( ) { return ddd ; }public void setDdd ( Short ddd) { thi s . ddd =ddd ; }public St r i ng getNumero ( ) { return numero ; }48public void setNumero ( St r i ng numero ) {thi s . numero =numero ;}@Overridepublic St r i ng t oSt r i ng ( ) {return ( +getDdd ( ) + ) +getNumero ( ) ;}}Observacao: Sobrescrevi ometodotoString() paraimprimir de formamaisamigavelachavecomposta.Notequeadicionamosaanotac ao@EmbeddablenaclasseTelefonePKparainformarqueest aclasseser aadicionadoemoutraentidade.Paraadicionarmosachavecompostanaentidade, vamoscriarumatri-buto do tipo da classe que possui a anotac ao @Embeddable e vamos adicionaraanotac aojavax.persistence.EmbeddedIdnesteatributo.NaentidadeTelefonevamos declarar umatributochamadoiddotipoTelefonePKpararepresentarachavecomposta:package pbc . j pa . exemplo . chave . composta . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . EmbeddedId ;import j avax . pe r s i s t e nc e . Enti ty ;/ Cl asse u t i l i z a d a para r epr es ent ar o t e l e f o ne de um c l i e n t e . Nesta c l a s s e abordamos o uso da chave composta at r av e s da anota cao @EmbeddedId ./@Entitypublic cl ass Tel ef one implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=5999236902534007386L;@EmbeddedIdprivate TelefonePK i d ;private St r i ng c l i e n t e;49public St r i ng ge t Cl i e nt e ( ) { return c l i e n t e; }public void s e t Cl i e nt e ( St r i ng c l i e n t e ) {thi s .c l i e n t e = c l i e n t e;}public TelefonePK get I d ( ) { return i d ; }public void s e t I d ( TelefonePK i d ) { thi s . i d =i d ; }}AgoravamoscriaraclasseTelefoneDAOparaexecutarasoperac oesdeSalvar,Alterar,Consultarporchavecompostaeapagarotelefone:package pbc . j pa . exemplo . chave . composta . dao ;import j avax . pe r s i s t e nc e . Ent i t yExi s t s Except i on ;import j avax . pe r s i s t e nc e . Enti tyManager ;import j avax . pe r s i s t e nc e . Enti tyManagerFactory ;import j avax . pe r s i s t e nc e . Pe r s i s t e nc e ;import pbc . j pa . exemplo . chave . composta . modelo . Tel ef one ;import pbc . j pa . exemplo . chave . composta . modelo . TelefonePK ;/ Cl asse u t i l i z a d a para t e s t a r as opera co es Sal var, Al t era, Consul t ar por Id e Apagar o r e g i s t r o de um t e l e f o ne ./public cl ass TelefoneDAO{public Enti tyManager getEnti tyManager ( ) {Enti tyManagerFactory f ac t or y =nul l ;Enti tyManager enti tyManager =nul l ;try {f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory( ExemplosJPAPU ) ;enti tyManager =f ac t or y . createEnti tyManager ( ) ;} f i nal l y {f ac t or y . c l o s e( ) ;}50return enti tyManager ;}public Tel ef one cons ul t ar Por I d ( TelefonePK i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;Tel ef one t e l e f o ne =nul l ;try {t e l e f o ne =enti tyManager . f i nd ( Tel ef one . cl ass, i d ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return t e l e f o ne;}public Tel ef one s al var ( Tel ef one t e l e f o ne )throws Excepti on {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;enti tyManager .p e r s i s t ( t e l e f o ne) ;enti tyManager . f l us h( ) ;enti tyManager . get Tr ans act i on ( ) . commit ( ) ;/ Esta exce cao pode s er l an cada caso j a e x i s t a um r e g i s t r ocoma mesma chave composta . /} catch ( Ent i t yExi s t s Except i on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;thrownewExcepti on ( Este t e l e f o ne j a e s t a r e g i s t r a dopara outro c l i e n t e. ) ;} catch ( Excepti on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}51return t e l e f o ne;}public Tel ef one a t ua l i z a r ( Tel ef one t e l e f o ne )throws Excepti on {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;enti tyManager . merge ( t e l e f o ne) ;enti tyManager . f l us h( ) ;enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} catch ( Excepti on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return t e l e f o ne;}public void apagar ( TelefonePK i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;Tel ef one t e l e f o ne =enti tyManager . f i nd ( Tel ef one . cl ass,i d ) ;enti tyManager . remove ( t e l e f o ne) ;enti tyManager . f l us h( ) ;enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} catch ( Excepti on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}}}52NometodoconsultarPorIdprecisamos agorapassar umatributodachavecompostaTelefonePKparaquepossamoslocalizarumtelefone.NometodosalvarvamosreceberoobjetoTelefonequeser asalvo, noteque estamos tratando a excecao javax.persistence.EntityExitsExceptionque ser a lancada caso tentamos salvar duas entidades com o mesmo id, nestecasocomomesmoddden umerodetelefone.Criamosagoraummetodoatualizarseparadoapenasparaatualizarotelefone, poispodemoscriarumTelefoneealteraronomedocliente, masn aopodemoscriardoistelefonescomomesmoddden umerodetelefone.No metodo apagar precisamos receber um objeto que representa a chavecomposta TelefonePK, desta forma podemos localizar o objeto Telefone paraquepossamosapag a-lo.NestaclasseTelefoneDAOTestevamos testar todas as opera coes daclasseTelefoneDAOdeclaradaacima:package pbc . j pa . exemplo . chave . composta . dao ;import pbc . j pa . exemplo . chave . composta . modelo . Tel ef one ;import pbc . j pa . exemplo . chave . composta . modelo . TelefonePK ;/ Cl asse u t i l i z a d a para t e s t a r as opera co es da c l a s s e TelefoneDAO./public cl ass TelefoneDAOTeste {public stati c void main( St r i ng[ ] ar gs ) throws Excepti on {/ Cria uma chave composta . /TelefonePK pk =newTelefonePK ( ) ;pk . setDdd ( ( short ) 11) ;pk . setNumero ( 11111111 ) ;/ Cria um t e l e f o ne . /Tel ef one t e l =newTel ef one ( ) ;t e l. s e t I d ( pk ) ;t e l. s e t Cl i e nt e ( Sakurai ) ;TelefoneDAO dao =newTelefoneDAO ( ) ;System . out . pr i nt l n ( Sal vando o t e l e f o ne: +pk ) ;53dao . s al var ( t e l) ;System . out . pr i nt l n ( Consul tando o t e l e f o ne: +pk ) ;Tel ef one t e l 2 =dao . cons ul t ar Por I d ( pk ) ;System . out . pr i nt l n ( Cl i e nt e + t e l 2 . ge t Cl i e nt e( ) ) ;try {System . out . pr i nt l n ( Tentando s al var o mesmo n umerode t e l e f o ne para outro c l i e n t e. ) ;Tel ef one t e l 3 =newTel ef one ( ) ;t e l 3. s e t I d ( pk ) ;t e l 3. s e t Cl i e nt e ( Raf ael ) ;dao . s al var ( t e l 3) ;} catch ( Excepti on ex ) {System . out . pr i nt l n ( ex . getMessage ( ) ) ;}System . out . pr i nt l n ( Al terando o c l i e n t e: ) ;t e l. s e t Cl i e nt e ( Raf ael ) ;dao . a t ua l i z a r ( t e l) ;System . out . pr i nt l n ( Apagando o r e g i s t r o do t e l e f o ne: ) ;dao . apagar ( pk ) ;}}543 RelacionamentoentreEntitysOsrelacionamentostambempodemser:UnidirecionalApartir deumaentidade, epossvel encontrar outraentidade, mas ocontrarionaoacontece,nesseexemploaEntidadeAconheceaEntidadeB,masocontrarion aoacontece.Figura15: Relacionamentounidirecional.BidirecionalAmbasentidadesseconhecem, nesseexemploaEntidadeAconheceaEntidadeBevice-versa.Figura16: Relacionamentobidirecional.Essesrelacionamentoss aodenidosdeacordocomanecessidadedone-gocio,naoexisteumaregraquesempretemqueserunidirecionaloubidire-cional.3.1 Haquatrotiposdecardinalidade3.1.1 Um-para-Um(OneToOne)Este relacionamento informa que ha apenas umregistro da entidade relacio-nadocomumregistrodeoutraentidade.ExemploderelacionamentoUm-para-Umunidirecional:Scriptdobancodedados:CREATE TABLEMensagem (i d number( 5) NOT NULLPRIMARY KEY,assunto varchar2( 200) NOT NULL,55dataEnvi o dateNOT NULL,mensagemcorpo i d number( 5)) ;CREATE TABLEMensagemCorpo (i d number( 5) NOT NULL PRIMARY KEY,de s c r i c ao varchar2( 200)) ;ModeloUML:Figura17: RelacionamentoentreMensagemeMensagemCorpo.Neste exemplo denimos que uma Mensagem possui uma Mensagem-Corpo, entao desta forma a Mensagem sabe qual e seu MensagemCorpo, maso contrario nao existe, a MensagemCorpo n ao tem a necessidade de conhecerqual aMensagemestaassociadoaele, ouseja, temos umrelacionamentounidirecional.Primeiramente podemos mostrar apenas uma listagem de Mensagens, masn aotemnecessidadeporenquantodemostraroconte udodetodasasmen-sagens e depois caso eu queira ler o conte udo da mensagem podemos atravesdelachegarateseucorpoutilizandooatributodotipoMensagemCorpo.C odigofontedasclassescomorelacionamento:package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Date ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;56import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . OneToOne ;import j avax . pe r s i s t e nc e . Temporal ;import j avax . pe r s i s t e nc e . TemporalType ;/ Cl asse u t i l i z a d a para r epr es ent ar uma Mensagem./@Entitypublic cl ass Mensagemimplements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=1912492882356572322L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng assunto ;@Temporal ( TemporalType .DATE)private Date dataEnvi o ;@OneToOne( cascade=CascadeType . ALL)private MensagemCorpo mensagemCorpo ;public St r i ng getAssunto ( ) { return assunto ; }public void setAssunto ( St r i ng assunto ) {thi s . assunto =assunto ;}public Date getDataEnvi o ( ) { return dataEnvi o ; }public void setDataEnvi o ( Date dataEnvi o ) {thi s . dataEnvi o =dataEnvi o ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }57public MensagemCorpo getMensagemCorpo ( ) {return mensagemCorpo ;}public void setMensagemCorpo ( MensagemCorpo mensagemCorpo ) {thi s . mensagemCorpo =mensagemCorpo ;}}Na classe Mensagem utilizamos a anota cao javax.persistence.OneToOneparadenirorelacionamentodeum-para-umentreasclassesMensagemeMensagemCorpo.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;/ Cl asse u t i l i z a d a para r epr es ent ar o corpo de uma mensagem./@Entitypublic cl ass MensagemCorpo implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=986589124772488369L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng de s c r i c ao ;public St r i ng get Des cr i cao ( ) { return de s c r i c ao ; }public void s e t De s c r i c ao ( St r i ng de s c r i c ao ) {thi s . de s c r i c ao =de s c r i c ao ;58}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }}A classe MensagemCorpo e uma entidade normal que n ao conhece a classeMensagem.Notequenaoprecisamoscriarnenhumareferenciaparainformarqueoatributo mensagemCorpo da classe Mensagem referencia a coluna men-sagemcorpoiddatabelaMensagem.OJPApossuialgunspadr oesparafacilitaromapeamentoentreaclasseJava e a tabela do banco de dados, quando criamos uma coluna de chave es-trangeiraseguindoopadr aonometabelachaveprimaria, omapeamentoefeitoautomaticamentepeloJPA, ouseja, oatributoMensagemCorpomensagemCorpo e automaticamente associado com a coluna mensagem-corpoid.javax.persistence.OneToOneEsta anotac ao dene uma associa cao com outra entidade que tenha a mul-tiplicidadedeum-para-um. Atabela7mostraaspropriedadesdaanota [email protected] Descricaocascade Asoperacoesqueprecisamserreetidasnoalvodaas-sociac ao.fetch Informa se o alvo da associa cao precisa ser obtido apenasquandofornecess arioousesempredevetrazer.mappedBy Informaoatributoque edonodorelacionamento.optional Informaseaassociac ao eopcional.targetEntity Aclasseentityque ealvodaassociac ao.Tabela7: [email protected] precisamos especicar um mapeamento que n ao e padr ao do JPA,podemos utilizar a anotac ao javax.persistence.JoinColumn, por exemploseatabelaMensagemeMensagemCorpofossem:CREATE TABLEMensagem (59i d number( 5) NOT NULL PRIMARY KEY,assunto varchar2 ( 200) ,dataEnvi o date ,IDMENSAGEMCORPOnumber( 5)) ;CREATE TABLEMensagemCorpo (MC IDnumber( 5) NOT NULLPRIMARY KEY,de s c r i c ao varchar2( 200)) ;PoderamosutilizaroJoinColumnparacriaraassocia cao:@OneToOne( cascade=CascadeType . ALL)@JoinColumn( name=IDMENSAGEMCORPO , referencedColumnName=MCID )private MensagemCorpo mensagemCorpo ;javax.persistence.JoinColumnEsta anotac ao e utilizada para especicar a coluna utilizada na associa caocomoutraentity. Atabela8apresentaaspropriedadesdaanotac [email protected] DescricaocolumnDenition Denic aodotipodacoluna.insertable Informaseacoluna eincludanoSQLdeINSERT.name Informaonomedacolunadechaveestrangeira.nullable Informaseacolunapodesernull.referencedColumnName Nome da coluna que e referenciada pela coluna da chaveestrangeira.table Nomedatabelaquecontemacoluna.unique Informaseapropriedade echave unica.updatable Informaseacoluna eincludanoSQLdeUPDATE.Tabela8: [email protected] Um-para-Muitos(OneToMany)Este relacionamento informa que o registro de uma entidade est a relacionadocomvariosregistrosdeoutraentidade.60ExemploderelacionamentoUm-para-Muitosunidirecional:Scriptdobancodedados:CREATE TABLEAula (i d number( 5) NOT NULL PRIMARY KEY,t i t u l o varchar2( 45) NOT NULL,data dateNOT NULL) ;CREATE TABLETaref a (i d number( 5) NOT NULL PRIMARY KEY,t i t u l o varchar2( 45) NOT NULL,de s c r i c ao varchar2( 45) NOT NULL,aul a i d number( 5)) ;ModeloUML:Figura18: RelacionamentoentreAulaeTarefa.NesteexemplodenimosqueumaAulapossuiumalistadeTarefa,ouseja, aaulapodenaoter tarefa, podeter apenasumatarefaoupodetervarias tarefas, uma Tarefa n ao precisa saber de qual Aula ela esta associada,portantotemosumrelacionamentounidirecional.C odigofontedasclassescomorelacionamento:NaclasseAulautilizamosaanota caojavax.persistence.OneToManynoatributotarefas,parainformarqueumaAulaest aassociadacomv ariastarefas.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;61import j ava .u t i l. Date ;import j ava .u t i l. Li s t ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . JoinColumn ;import j avax . pe r s i s t e nc e . OneToMany;import j avax . pe r s i s t e nc e . Temporal ;import j avax . pe r s i s t e nc e . TemporalType ;/ Cl asse u t i l i z a d a para r epr es ent ar uma aul a ./@Entitypublic cl ass Aula implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=6745032908099856302L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng t i t u l o;@Temporal ( TemporalType .DATE)private Date data ;@OneToMany( cascade =CascadeType . ALL)@JoinColumn( name= aul a i d )private Li s t t a r e f a s;public Date getData ( ) { return data ; }public void setData ( Date data ) { thi s . data =data ; }public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }62public St r i ng ge t Ti t ul o ( ) { return t i t u l o; }public void s e t Ti t ul o ( St r i ng t i t u l o ) {thi s .t i t u l o = t i t u l o;}public Li s t get Tar ef as ( ) { return t a r e f a s; }public void s e t Tar e f as ( Li s t t a r e f a s ) {thi s .t a r e f a s = t a r e f a s;}}javax.persistence.OneToManyEstaanota caodeneumaassociac aocomoutraentidadequetenhaamultiplicidadedeum-para-muitos.Propriedade Descricaocascade Asoperacoesqueprecisamserreetidasnoalvodaas-sociac ao.fetch Informa se o alvo da associa cao precisa ser obtido apenasquandofornecess arioousesempredevetrazer.mappedBy Informaoatributoque edonodorelacionamento.targetEntity Aclasseentityque ealvodaassociac ao.Tabela9: [email protected] eumaentidadenormalquen aoconheceaclasseAula.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . ManyToOne ;/ Cl asse u t i l i z a d a para r epr es ent ar as t a r e f a s apl i c adas emuma aul a .63/@Entitypublic cl ass Taref a implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=2952630017127173988L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng t i t u l o;private St r i ng de s c r i c ao ;public St r i ng get Des cr i cao ( ) { return de s c r i c ao ; }public void s e t De s c r i c ao ( St r i ng de s c r i c ao ) {thi s . de s c r i c ao =de s c r i c ao ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng ge t Ti t ul o ( ) { return t i t u l o; }public void s e t Ti t ul o ( St r i ng t i t u l o ) {thi s .t i t u l o = t i t u l o;}}Muitos-para-Um(ManyToOne)Esterelacionamentoinformaqueexistemmuitosregistrosdeumaenti-dadeassociadosaumregistrodeoutraentidade.Exemplo de relacionamento Um-para-Muitos e Muitos-para-Um bidireci-onal:Scriptdobancodedados:CREATE TABLEPessoa (i d number( 5) NOT NULL PRIMARY KEY,nome varchar2( 200) NOT NULL,cpf varchar2( 11) NOT NULL) ;64CREATE TABLETel ef one (i d number( 5) NOT NULL PRIMARY KEY,t i po varchar2( 200) NOT NULL,numero number( 8) NOT NULL,pe s s oa i d number( 5)) ;ModeloUML:Figura19: RelacionamentoentrePessoaeTelefone.Neste exemplo denimos que uma Pessoa possui uma lista de Telefones eum Telefone est a associado a uma Pessoa, portanto temos um relacionamentobidirecional.C odigofontedasclassescomorelacionamento:NaentidadePessoadenimos queumapessoapossui v arios telefonesatraves do atributo Listtelefones e adicionamos a anotac aojavax.persistence.OneToManyparainformar que orelacionamentodePessoaparaTelefoneedeUm-para-Muitos,notequenestaanota caodeni-mosapropriedademappedBycomopessoaqueeparainformarqueoatributocomonomepessoanaentityTelefonequeedonadorelaciona-mento.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Li s t ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;65import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . OneToMany;/ Cl asse u t i l i z a d a para r epr es ent ar uma Pessoa ./@Entitypublic cl ass Pessoa implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=1905907502453138175L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng nome ;private St r i ng cpf ;@OneToMany( mappedBy= pessoa , cascade=CascadeType . ALL)private Li s t t e l e f o ne s;public St r i ng getCpf ( ) { return cpf ; }public void setCpf ( St r i ng cpf ) { thi s . cpf =cpf ; }public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }public Li s t ge t Te l e f one s ( ) { return t e l e f o ne s; }public void s e t Te l e f one s ( Li s t t e l e f o ne s ) {thi s .t e l e f o ne s = t e l e f o ne s;}}Na entidade Telefone denimos o atributo Pessoapessoa e adicionamosaanotac aojavax.persistence.ManyToOneparadenirqueorelaciona-mentodeTelefoneparaPessoa edeMuitos-para-Um.package pbc . j pa . exemplo . modelo ;66import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . ManyToOne ;/ Cl asse u t i l i z a d a para r epr es ent ar umTel ef one ./@Entitypublic cl ass Tel ef one implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=7526502149208345058L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng t i po ;private I nt e ge r numero ;@ManyToOneprivate Pessoa pessoa ;public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public I nt e ge r getNumero ( ) { return numero ; }public void setNumero ( I nt e ge r numero ) {thi s . numero =numero ;}public Pessoa getPessoa ( ) { return pessoa ; }public void s et Pes s oa ( Pessoa pessoa ) {thi s . pessoa =pessoa ;}public St r i ng getTi po ( ) { return t i po ; }67public void setTi po ( St r i ng t i po ) { thi s . t i po =t i po ; }}javax.persistence.ManyToOneEstaanota caodeneumaassociac aocomoutraentidadequetenhaamultiplicidadedemuitos-para-um.Propriedade Descricaocascade Asoperacoesqueprecisamserreetidasnoalvodaas-sociac ao.fetch Informa se o alvo da associa cao precisa ser obtido apenasquandofornecess arioousesempredevetrazer.optional Informaseaassociac ao eopcional.targetEntity Aclasseentityque ealvodaassociac ao.Tabela10: Propriedadesdaanotacao@ManyToOne.Tambempodemosadicionarumatabelapararealizarorelacionamentounidirecional de um-para-muitos e o relacionamento muitos-para-muitos, nor-malmente utilizamos est a alternativa como uma forma de normalizar os dadosevitandoduplicaroconte udodosregistros.Nesseexemploqueremosutilizar aentidadeTelefonecomasentidadesPessoaeAluno, dessaformaPessoapossui umalistadeTelefoneseAlunopossui umalistadeTelefones, masotelefonen aosabeparaquemeleestaassociado. Estetipoderelacionamento eunidirecionaldeum-para-muitos.Figura20: RelacionamentoentrePessoa,TelefoneeAluno.Na base de dados iremos criar as tabelas Pessoa, Telefone e Aluno, tambemiremos criar duas tabelas de associac ao chamadas PessoaTelefone e AlunoTelefone:CREATE TABLEPessoa (i d number( 5) NOT NULL PRIMARY KEY,68nome varchar2( 200) NOT NULL,cpf varchar2( 11) NOT NULL) ;CREATE TABLEAluno (i d number( 5) NOT NULLPRIMARY KEY,nome varchar2( 200) NOT NULL,mat r i cul a number( 5) NOT NULL) ;CREATE TABLETel ef one (i d number( 5) NOT NULL PRIMARY KEY,t i po varchar2( 200) NOT NULL,numero number( 5) NOT NULL) ;CREATE TABLEPes s oa Tel ef one (pe s s oa i d number( 5) ,t e l e f o n e i d number( 5)) ;CREATE TABLEAl uno Tel ef one (al uno i d number( 5) ,t e l e f o n e i d number( 5)) ;NaentidadePessoadenimos queumapessoapossui v arios telefonesatravesdoatributoListtelefoneseadicionamosaanota caojavax.persistence.OneToManyparainformar que orelacionamentodePessoaparaTelefone edeUm-para-Muitos.Parainformar quevamos utilizar atabelaPESSOATELEFONEpararealizaraassociac aoentreastabelasPESSOAeTELEFONEutilizamosaanotac aojavax.persistence.JoinTable.Para informar que a coluna PESSOAID da tabela PESSOATELEFONEeacolunachaveestrangeiraparaatabelaPESSOAeparainformarqueacolunaTELEFONEIDdatabelaPESSOATELEFONEeachaveestran-geiraparaatabelaTELEFONEutilizamosaanotac aojavax.persistence.JoinColumn.69package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Li s t ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . FetchType ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . JoinColumn ;import j avax . pe r s i s t e nc e . Joi nTabl e ;import j avax . pe r s i s t e nc e . OneToMany;/ Cl asse u t i l i z a d a para r epr es ent ar uma Pessoa ./@Entitypublic cl ass Pessoa implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=1905907502453138175L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng nome ;private St r i ng cpf ;@OneToMany( cascade=CascadeType . ALL, f e t c h=FetchType .EAGER)@JoinTable ( name=PESSOA TELEFONE ,j oi nCol umns={@JoinColumn( name =PESSOAID ) } ,i nverseJoi nCol umns={@JoinColumn( name =TELEFONE ID ) })private Li s t t e l e f o ne s;public St r i ng getCpf ( ) { return cpf ; }public void setCpf ( St r i ng cpf ) { thi s . cpf =cpf ; }public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }70public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }public Li s t ge t Te l e f one s ( ) { return t e l e f o ne s; }public void s e t Te l e f one s ( Li s t t e l e f o ne s ) {thi s .t e l e f o ne s = t e l e f o ne s;}}javax.persistence.JoinTableEstaanotac aoeutilizadaparadenirumatabelaqueser autilizadanaassociac aodeum-para-muitosoudemuitos-para-muitos.Propriedade Descricaocatalog Ocatalogodatabela.inverseJoinColumns Chaveestrangeirapararealizaraassociacaocomata-belaquen ao edonadorelacionamento.joinColumns Chaveestrangeirapararealizaraassociacaocomata-belaque edonadorelacionamento.name Nomedatabeladeassocia cao.schema Esquemadatabela.uniqueConstraints Regrasquepodemseradicionadasnatabela.Tabela11: [email protected] entidade Aluno denimos que um aluno possui v arios telefones atravesdoatributoListtelefoneseadicionamos aanotac aojavax.persistence.OneToManyparainformar queorelacionamentodeAlunoparaTelefone edeUm-para-Muitos.Parainformar que vamos utilizar atabelaALUNOTELEFONEpararealizaraassociac aoentreastabelasALUNOeTELEFONEutilizamosaanotac aojavax.persistence.JoinTable.Para informar que a coluna ALUNOID da tabela ALUNOTELEFONE ea coluna chave estrangeira para a tabela ALUNO e para informar que a colunaTELEFONEID da tabela ALUNOTELEFONE e a chave estrangeira para atabela TELEFONE utilizamos a anotac ao javax.persistence.JoinColumn.package pbc . j pa . exemplo . modelo ;71import j ava .u t i l. Li s t ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . FetchType ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . JoinColumn ;import j avax . pe r s i s t e nc e . Joi nTabl e ;import j avax . pe r s i s t e nc e . OneToMany;/ Cl asse u t i l i z a d a para r epr es ent ar uma ent i dade Aluno ./@Entitypublic cl ass Aluno {@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng nome ;private Long mat r i cul a ;@OneToMany( cascade=CascadeType . ALL, f e t c h=FetchType .EAGER)@JoinTable ( name=ALUNO TELEFONE ,j oi nCol umns={@JoinColumn( name =ALUNO ID ) } ,i nverseJoi nCol umns={@JoinColumn( name =TELEFONE ID ) })private Li s t t e l e f o ne s;public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public Long get Mat r i cul a ( ) { return mat r i cul a ; }public void s et Mat r i cul a ( Long mat r i cul a ) {thi s . mat r i cul a =mat r i cul a ;}public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }72public Li s t ge t Te l e f one s ( ) { return t e l e f o ne s; }public void s e t Te l e f one s ( Li s t t e l e f o ne s ) {thi s .t e l e f o ne s = t e l e f o ne s;}}AgoravamosdeclararaentidadeTelefone, notequeestaentidadenaoconheceasassociac oesques aocriadasparaela.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;/ Cl asse u t i l i z a d a para r epr es ent ar umTel ef one ./@Entitypublic cl ass Tel ef one implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=7526502149208345058L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng t i po ;private I nt e ge r numero ;public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public I nt e ge r getNumero ( ) { return numero ; }public void setNumero ( I nt e ge r numero ) {thi s . numero =numero ;}73public St r i ng getTi po ( ) { return t i po ; }public void setTi po ( St r i ng t i po ) { thi s . t i po =t i po ; }}ParatestarocadastrodeAlunoeTelefonevamoscriaraclasseAluno-DAOparasalvar, alterar, consultarporideapagarosregistrodoalunoetelefone.package pbc . j pa . exemplo . dao ;import j avax . pe r s i s t e nc e . Enti tyManager ;import j avax . pe r s i s t e nc e . Enti tyManagerFactory ;import j avax . pe r s i s t e nc e . Ent i t yTr ans act i on ;import j avax . pe r s i s t e nc e . Pe r s i s t e nc e ;import pbc . j pa . exemplo . modelo . Aluno ;/ Cl asse DAOpara mani pul ar as i nf orma co es do Aluno no banco de dados ./public cl ass AlunoDAO{private Enti tyManager getEnti tyManager ( ) {Enti tyManagerFactory f ac t or y =nul l ;Enti tyManager enti tyManager =nul l ;try {//Obtemo f ac t or y a p a r t i r da uni dade de p e r s i s t e nci a .f ac t or y =Pe r s i s t e nc e . createEnti tyManagerFactory( Uni dadeDePer si st enci a ) ;//Cria um e nt i t y manager .enti tyManager =f ac t or y . createEnti tyManager ( ) ;} f i nal l y {f ac t or y . c l o s e( ) ;}return enti tyManager ;}public Aluno cons ul t ar Por I d ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;74Aluno al uno =nul l ;try {al uno =enti tyManager . f i nd ( Aluno . cl ass, i d ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}return al uno ;}public Aluno s al var ( Aluno al uno ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;System . out . pr i nt l n ( Sal vando as i nf orma c o es do al uno . ) ;/ Ve r i f i c a se o al uno ai nda nao e s t a s al v o nobanco de dados . /i f ( al uno . get I d ( ) ==nul l ) {enti tyManager .p e r s i s t ( al uno ) ;} el se {al uno =enti tyManager . merge ( al uno ) ;}// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} catch( Excepti on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}// Retorna o al uno s al v o .return al uno ;}public void apagar ( Long i d ) {Enti tyManager enti tyManager =getEnti tyManager ( ) ;try {// I ni c i a uma t rans a cao como banco de dados .enti tyManager . get Tr ans act i on ( ) . begi n ( ) ;75// Consul t a o al uno na base de dados at r av e s do seu ID.Aluno al uno =enti tyManager . f i nd ( Aluno . cl ass, i d ) ;System . out . pr i nt l n ( Excl ui ndo o al uno : +al uno . getNome ( ) ) ;// Remove o al uno da base de dados .enti tyManager . remove ( al uno ) ;// Fi nal i z a a t rans a cao .enti tyManager . get Tr ans act i on ( ) . commit ( ) ;} catch( Excepti on ex ) {enti tyManager . get Tr ans act i on ( ) .r ol l bac k( ) ;} f i nal l y {enti tyManager . c l o s e( ) ;}}}VamoscriaraclasseAlunoDAOTestequeutilizaaclasseAlunoDAOpara salvar, alterar, consultar por id e apagar os registros de aluno e telefone:package pbc . j pa . exemplo . dao ;import j ava .u t i l. Arr ayLi st ;import j ava .u t i l. Li s t ;import pbc . j pa . exemplo . modelo . Aluno ;import pbc . j pa . exemplo . modelo . Tel ef one ;/ Cl asse u t i l i z a d a para t e s t a r as opera co es do banco de dados r e f e r e nt e ao Aluno ./public cl ass AlunoDAOTeste {public stati c void main( St r i ng[ ] ar gs ) {AlunoDAOdao =newAlunoDAO( ) ;//Cria uma al uno .Aluno al uno =newAluno ( ) ;al uno . setNome ( Raf ael ) ;al uno . s et Mat r i cul a (123456L) ;76//Cria o t e l e f o ne r e s i d e nc i a l do al uno .Tel ef one t e l e f o ne =newTel ef one ( ) ;t e l e f o ne. setTi po ( RES ) ;t e l e f o ne. setNumero ( 12345678) ;//Cria o t e l e f o ne c e l u l a r do al uno .Tel ef one t e l e f o ne 2 =newTel ef one ( ) ;t e l e f o ne 2 . setTi po ( CEL ) ;t e l e f o ne 2 . setNumero ( 87654321) ;//Cria uma l i s t a de t e l e f o ne s e guarda dent ro do al uno .Li s t t e l e f o ne s =newArrayLi st ();t e l e f o ne s. add( t e l e f o ne) ;t e l e f o ne s. add( t e l e f o ne 2) ;al uno . s e t Te l e f one s ( t e l e f o ne s) ;System . out . pr i nt l n ( Sal va as i nf orma c o es do al uno . ) ;al uno =dao . s al var ( al uno ) ;System . out . pr i nt l n ( Consul ta o al uno que f o i s al vo . ) ;Aluno al unoConsul tado =dao . cons ul t ar Por I d ( al uno . get I d ( ) ) ;System . out . pr i nt l n ( al uno . getNome ( ) ) ;for ( Tel ef one t e l : al uno . ge t Te l e f one s ( ) ) {System . out . pr i nt l n ( t e l. getTi po ( ) + + t e l. getNumero ( ) ) ;}//Cria o t e l e f o ne comerci al do al uno .Tel ef one t e l e f o ne 3 =newTel ef one ( ) ;t e l e f o ne 3 . setTi po ( COM ) ;t e l e f o ne 3 . setNumero ( 55554444) ;// Adi ci ona o novo t e l e f o ne a l i s t a de t e l e f o ne do al uno .al unoConsul tado . ge t Te l e f one s( ) . add( t e l e f o ne 3) ;System . out . pr i nt l n ( At ual i za as i nf orma co es do al uno . ) ;al unoConsul tado =dao . s al var ( al unoConsul tado ) ;System . out . pr i nt l n ( al unoConsul tado . getNome ( ) ) ;for ( Tel ef one t e l : al unoConsul tado . ge t Te l e f one s ( ) ) {77System . out . pr i nt l n ( t e l. getTi po ( ) + + t e l. getNumero ( ) ) ;}System . out . pr i nt l n ( Apaga o r e g i s t r o do al uno . ) ;dao . apagar ( al unoConsul tado . get I d ( ) ) ;}}QuandoexecutamosaclasseAlunoDAOTestetemosaseguintesadanoconsole:Sal va as i nf orma c o es do al uno :Hi bernate : i ns e r t i nt o Aluno ( matri cul a, nome) val ues ( ? , ?)Hi bernate : i ns e r t i nt o Tel ef one ( numero , t i po ) val ues ( ? , ?)Hi bernate : i ns e r t i nt o Tel ef one ( numero , t i po ) val ues ( ? , ?)Hi bernate : i ns e r t i nt o ALUNO TELEFONE (ALUNO ID, TELEFONE ID)val ues ( ? , ?)Hi bernate : i ns e r t i nt o ALUNO TELEFONE (ALUNO ID, TELEFONE ID)val ues ( ? , ?)Consul ta o al uno que f o i s al vo :Hi bernate : s e l e c t al uno0 . i d as i d21 1 , al uno0 . mat r i cul a asmat r i cul a21 1 , al uno0 . nome as nome21 1 , t e l e f o n e s 1 . ALUNO IDas ALUNO13 , t e l e f o ne 2 . i d as TELEFONE23 , t e l e f o ne 2 . i d asi d18 0 , t e l e f o ne 2 . numero as numero18 0 , t e l e f o ne 2 . t i po ast i po18 0 from Aluno al uno0 l e f t out er j o i n ALUNO TELEFONEt e l e f o n e s 1 on al uno0 . i d=t e l e f o n e s 1 . ALUNO ID l e f t out er j o i nTel ef one t e l e f o ne 2 on t e l e f o n e s 1 . TELEFONE ID=t e l e f o ne 2 . i dwhere al uno0 . i d=?Raf aelRES 12345678CEL 87654321At ual i za as i nf orma c o es do al uno :Hi bernate : s e l e c t al uno0 . i d as i d38 1 , al uno0 . mat r i cul a asmat r i cul a38 1 , al uno0 . nome as nome38 1 , t e l e f o n e s 1 . ALUNO ID78as ALUNO13 , t e l e f o ne 2 . i d as TELEFONE23 , t e l e f o ne 2 . i d asi d35 0 , t e l e f o ne 2 . numero as numero35 0 , t e l e f o ne 2 . t i po ast i po35 0 from Aluno al uno0 l e f t out er j o i n ALUNO TELEFONEt e l e f o n e s 1 on al uno0 . i d=t e l e f o n e s 1 . ALUNO ID l e f t out er j o i nTel ef one t e l e f o ne 2 on t e l e f o n e s 1 . TELEFONE ID=t e l e f o ne 2 . i dwhere al uno0 . i d=?Hi bernate : i ns e r t i nt o Tel ef one ( numero , t i po ) val ues ( ? , ?)Hi bernate : de l e t e fromALUNO TELEFONEwhere ALUNO ID=?Hi bernate : i ns e r t i nt o ALUNO TELEFONE (ALUNO ID, TELEFONE ID)val ues ( ? , ?)Hi bernate : i ns e r t i nt o ALUNO TELEFONE (ALUNO ID, TELEFONE ID)val ues ( ? , ?)Hi bernate : i ns e r t i nt o ALUNO TELEFONE (ALUNO ID, TELEFONE ID)val ues ( ? , ?)Raf aelRES 12345678CEL 87654321COM 55554444Apaga o r e g i s t r o do al uno :Hi bernate : s e l e c t al uno0 . i d as i d55 1 , al uno0 . mat r i cul a asmat r i cul a55 1 , al uno0 . nome as nome55 1 , t e l e f o n e s 1 . ALUNO IDas ALUNO13 , t e l e f o ne 2 . i d as TELEFONE23 , t e l e f o ne 2 . i d asi d52 0 , t e l e f o ne 2 . numero as numero52 0 , t e l e f o ne 2 . t i po ast i po52 0 from Aluno al uno0 l e f t out er j o i n ALUNO TELEFONEt e l e f o n e s 1 on al uno0 . i d=t e l e f o n e s 1 . ALUNO ID l e f t out er j o i nTel ef one t e l e f o ne 2 on t e l e f o n e s 1 . TELEFONE ID=t e l e f o ne 2 . i dwhere al uno0 . i d=?Hi bernate : de l e t e fromALUNO TELEFONEwhere ALUNO ID=?Hi bernate : de l e t e from Tel ef one where i d=?Hi bernate : de l e t e from Tel ef one where i d=?Hi bernate : de l e t e from Tel ef one where i d=?Hi bernate : de l e t e from Aluno where i d=?793.1.3 Muitos-para-Muitos(ManyToMany)Este relacionamentoinformaque muitos registros de umaentidade est aorelacionadoscommuitosregistrosdeoutraentidade:Scriptdobancodedados:CREATE TABLEPr oj et o (i d number( 5) NOT NULLPRIMARY KEY,nome varchar2( 200) NOT NULL) ;CREATE TABLEFunci onar i o (i d number( 5) NOT NULLPRIMARY KEY,nome varchar2( 200) NOT NULL) ;CREATE TABLEPr oj et o Funci onar i o (pr o j e t o i d number( 5) ,f unc i o na r i o i d number( 5)) ;Note que nesse casoprecisamos utilizar umatabelaintermediariaen-treProjetoeFuncionario,paraevitarduplicardados(normalizac ao)desne-cess arios no banco de dados. Atraves da tabela ProjetoFuncionario criamosorelacionamentoentreProjetoeFuncionario.ModeloUML:Figura21: RelacionamentoentreProjetoeFuncionario.Neste exemplo denimos que umProjetotemv arios funcionarios, eumFuncionarioparticipade v arios projetos, portantotemos umrelaci-onamentobidirecionaldemuitos-para-muitos.80C odigofontedasclassescomorelacionamento:A entidade Projeto possui um relacionamento de muitos-para-muitoscom a entidade Funcionario, para denir esta associac ao utilizamos a anota caojavax.persistence.ManyToMany, note que utilizamos a propriedade map-pedByda anota cao ManyToMany para informar que o Projeto e o dono dorelacionamento.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Li s t ;import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . ManyToMany;/ Cl asse u t i l i z a d a para r epr es ent ar um pr oj e t o ./@Entitypublic cl ass Pr oj et o implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ver s i onUI D=1081869386060246794L;@Id@GeneratedValue ( s t r at e gy =Generati onType .AUTO)private Long i d ;private St r i ng nome ;@ManyToMany( mappedBy= pr oj e t os , cascade=CascadeType . ALL)private Li s t des envol vedor es ;public Li s t get Des envol vedor es ( ) {return des envol vedor es ;}public void s et Des envol vedor es ( Li s t des envol vedor es ) {81thi s . des envol vedor es =des envol vedor es ;}public Long get I d ( ) { return i d ; }public void s e t I d ( Long i d ) { thi s . i d =i d ; }public St r i ng getNome ( ) { return nome ; }public void setNome ( St r i ng nome) { thi s . nome =nome ; }}javax.persistence.ManyToManyEstaanota caodeneumaassociac aocomoutraentidadequetenhaamultiplicidadedemuitos-para-muitos.Propriedade Descricaocascade Asoperacoesqueprecisamserreetidasnoalvodaas-sociac ao.fetch Informa se o alvo da associa cao precisa ser obtido apenasquandofornecess arioousesempredevetrazer.mappedBy Informaoatributoque edonodorelacionamento.targetEntity Aclasseentityque ealvodaassociac ao.Tabela12: [email protected] entidade Funcionario possui um relacionamento de muitos-para-muitoscomaentidadeProjeto, paradenirestaassociac aoutilizamosaanotac aojavax.persistence.ManyToMany.ParainformarquevamosutilizaratabelaPROJETOFUNCIONARIOpararealizaraassociacaoentrePROJETOeFUNCIONARIOutilizamosaanotac aojavax.persistence.JoinTable.Para informar que a coluna PROJETOID da tabela PROJETOFUNCIONARIOeacolunachaveestrangeiraparaatabelaPROJETOeparainformarquea coluna FUNCIONARIOIDda tabela PROJETOFUNCIONARIOe achaveestrangeiraparaatabelaFUNCIONARIOutilizamosaanotac aoja-vax.persistence.JoinColumn.package pbc . j pa . exemplo . modelo ;import j ava . i o .S e r i a l i z a b l e;import j ava .u t i l. Li s t ;82import j avax . pe r s i s t e nc e . CascadeType ;import j avax . pe r s i s t e nc e . Enti ty ;import j avax . pe r s i s t e nc e . GeneratedVal ue ;import j avax . pe r s i s t e nc e . Generati onType ;import j avax . pe r s i s t e nc e . Id ;import j avax . pe r s i s t e nc e . JoinColumn ;import j avax . pe r s i s t e nc e . Joi nTabl e ;import j avax . pe r s i s t e nc e . ManyToMany;/ Cl asse u t i l i z a d a para r epr es ent ar umFunciona r i o ./@Entitypublic cl ass Funci onar i o implements S e r i a l i z a b l e {private stati c f i nal long s er i al Ve