Persistência e mapeamento objeto relacional Jobson Ronan {[email protected]}

of 37/37
Persistência e mapeamento objeto relacional Jobson Ronan {[email protected]}
  • date post

    07-Apr-2016
  • Category

    Documents

  • view

    216
  • download

    0

Embed Size (px)

Transcript of Persistência e mapeamento objeto relacional Jobson Ronan {[email protected]}

  • Persistncia e mapeamento objeto relacionalJobson Ronan {[email protected]}

  • Motivao para nossa caminhadaO que persistncia?O descasamento dos paradigmas: Relacional X OOMapeamento Objeto-RelacionalDesign Patterns relacionados: DAO Data Access Object

  • O que persistncia?Normalmente se refere preservao dos dados de uma aplicao alm do tempo de vida da aplicaoQuase todas as aplicaes requerem dados persistentes.Persistncia um conceito fundamental no desenvolvimento de aplicaes.Se um sistema de informaes no preserva os dados inseridos por um usurio quando desligado, esse sistema ter pouca utilidade na pratica

  • Relembrando o SQLUsado como Data Definition Language (DDL)Criar e alterar o schema (tabelas)Usado como Data Manipulation LanguageSistemas de gerenciamento de bancos de dados relacionais tm interfaces de programao baseadas em SQL

  • Usando SQL em JavaSentenas enviadas ao banco via Java DataBase Connectivity (JDBC) APICdigo SQL escrito a mo como StringsUsa-se JDBC para ligar argumentos a parmetros de consultasIniciar a execuo das consultasPercorrer a tabela de resultadosRecuperar valores do ResultSetE assim por diante...

  • Usando SQL em JavaFcil de usarEstas so tarefas baixo-nvel de acesso a dadosComo desenvolvedores de aplicaes, Estamos mais interessados nos problemas de negcios que requerem este acesso a dados

  • Em que estamos interessados?Persistncia orientada a objetosPermitir que um objeto viva mais que aplicao que o criouObjeto persistente qualquer objeto que tenha uma representao que sobreviva aplicaoObjeto transiente um objeto que no persistenteGravar um objeto em meio persistente significa preservar no s seu estado escalar, mas tambm todo o grafo de objetos dependentes e suas dependnciasPermitir que aplicao trabalhe com objetos e no com tabelasConsultas (Queries) operam sobre objetos e suas propriedades

  • Incompatibilidades dos paradigmasH vrios pontos onde o modelo relacional incompatvel com o modelo de objetosGranularidadeHerana e polimorfismoIdentidadeAssociaesNavegao em grafos

  • Incompatibilidades dos paradigmasO exemplo abaixo no apresenta problemas de descasamento de paradigma: simplesUser: representa o usurioBillingDetails: representa detalhes da cobrana

  • Incompatibilidades dos paradigmasNeste exemplo, o descasamento entre o paradigma objeto e relacional no aparecepublic class User { private String userName; private String name; private String address; private Set billingDetails; // (get/set pairs), etc. ...}public class BillingDetails { private String accountNumber; private String accountName; private String accountType; private User user; //methods, get/set pairs... } create table USER ( USERNAME VARCHAR(15) NOT NULL PRIMARY KEY, NAME VARCHAR(50) NOT NULL, ADDRESS VARCHAR(100))create table BILLING_DETAILS ( ACCOUNT_NUMBER VARCHAR(10) NOT NULL PRIMARY Key, ACCOUNT_NAME VARCHAR(50) NOT NULL, ACCOUNT_TYPE VARCHAR(2) NOT NULL, USERNAME VARCHAR(15) FOREIGN KEY REFERENCES USER)

  • Incompatibilidades dos paradigmasE se o usurio tiver um endereoDeve ser uma nova tabela? Deve aparecer como colunas extras na tabela do usurio?

    ProblemaObjetos podem ter vrios nveis de granularidadeTabelas (colunas) impem limitesTipos definidos pelo usurio: no padro em SQLSoluo usual colocar tudo na tabela USER

  • Incompatibilidades dos paradigmasPorm, este ainda um problema fcil de solucionarcreate table USER ( USERNAME VARCHAR(15) NOT NULL PRIMARY KEY, NAME VARCHAR(50) NOT NULL, ADDRESS_STREET VARCHAR(50), ADDRESS_CITY VARCHAR(15), ADDRESS_STATE VARCHAR(15), ADDRESS_ZIPCODE VARCHAR(5), ADDRESS_COUNTRY VARCHAR(15))UserAddress

  • Incompatibilidades dos paradigmasProblema mais complexoModelo relacional no suporta herana/polimorfismo

    Queremos escrever consultas que referem-se classe BillingDetails e retornar instncias concretas dessa classe!

  • Incompatibilidades dos paradigmasProblema da identidadeNo mundo relacional, existe um critrio de igualdade:Chave-primriaNo mundo Java h doisIgualdade de referncia (testado com ==)Equivalncia (testado com equals())Alm disso, mapeamento pode associar vrios objetos a uma mesma tabela!Complicaes adicionaisChaves naturaisChaves compostas

  • Incompatibilidades dos paradigmasProblema das AssociaesJava representa associaes como referncias (ou colees de) referncias para objetosSo inerentemente direcionaisPara implementar associaes bidirecionais, preciso criar referncias dos dois lados da associaoReferncias dos dois lados podem ser associaes M-NNo mundo relacional, associaes so representadas por chaves estrangeirasNo so inerentemente direcionaisPode-se criar associaes arbitrrias com projeo e joinsAssociaes M-N requerem tabela extra

  • Incompatibilidades dos paradigmasProblema da Navegao em grafosOu grafos de objetos vs. table joinsMais problema de incompatibilidades: dinmico!Navegao em objetosPula-se de um objeto para outro: objeto.getA().getB() sem a definio de um caminho previamente definidoEquivalente a fazer um query para cada pulo (n do grafo)Portanto, a forma mais natural de navegar entre objetos em Java a forma menos eficiente de recuperar dados em SQLSoluao: usar joins para minimizar queriesPorm, preciso traar o caminho de navegao antes!

  • SoluoUsar uma camada de persistncia para lidar com as incompatibilidades dos paradigmasRequer arquitetura com separao em camadas que concentram-se em um interesse predominanteSoluo recomendada pelos padres J2EE

  • SoluoCriar uma camada de persistncia usando JDBC. O padro mais usado o DAO Data Access ObjectIsola todas as chamadas ao banco (SQL) em um objeto e fornece uma API via interface para clientesClientes so objetos de negcio que desconhecem a tecnologia de persistncia usadaMas criar uma boa camada de persistncia exige trabalho preciso implementar eficientemente todo o SQL de acesso, relacionamentos, atualizao, etc. e integrar com APIs de transaes, cache, etc

  • Soluo basicamente implementar todo o mapeamento Objeto Relacional a moOpa! O que mesmo Mapeamento objeto relacional (ORM)?

  • Mapeamento Objeto RelacionalPrincpios bsicosClasses so mapeadas a tabelas (esquemas)Instncias (objetos) so mapeadas a registros (linhas)

  • Mapeamento Objeto RelacionalPorm quando falamos em ORM, estamos nos referindo normalmente ao processo automatizadoUma Soluo de ORM completa normalmente nos oferecerUma API para realizao de operaes bsicas de criao, leitura, atualizao e remoo (CRUD) em objetos de classes persistentesUma linguagem ou API para especificar consultas sobre classes e suas propriedadesUm recurso para especificar meta dados de mapeamentoUma tcnica que permita implementao interagir com objetos transacionais (para realizar funes de otimizao)

  • Por que ORM? Por que Hibernate?ProdutividadePermite concentrar-se na lgica de negcio da aplicaoManutenabilidadeMenos linhas de cdigoSeparao de camada de persistncia da de negciosPerformanceVrias otimizaesIndependncia de fabricanteIsolamento do fabricante de banco de dados

  • Questes relevantes a ORM e Hibernate Com que se parecem classes persistentes? (granularidade)Como so definidos os metadados?Como mapear hierarquias de herana?Como relacionar identidade de objetos identidade de bancoComo a lgica de persistncia interage em tempo de execuo com objetos do modelo de domnio?Qual o ciclo de vida de um objeto persistente?Que recursos existem para ordenao, agregao, pesquisa?Como recuperar dados em associaes?Como o sistema lida com cache e transaes?

  • ...Padres de projeto relacionados

  • DAO Data Access ObjectObjetivoAbstrair e encapsular todo o acesso a uma fonte de dados.O DAO gerencia a conexo com a fonte de dados para obter e armazenar os dados.

  • DAO Data Access ObjectDescrio do ProblemaForma de acesso aos dados varia consideravelmente dependendo da fonte de dados usadoBanco de dados relacionalArquivos (XML, CSV, texto, formatos proprietrios)Etc...Persistncia de objetos depende de integrao com fonte de dados (ex: business objects/classes bsicas)Colocar cdigo de persistncia (ex: JDBC) diretamente no cdigo do objeto que o utiliza ou do cliente amarra o cdigo desnecessariamente forma de implementao

  • DAO Data Access ObjectDescrio do ProblemaFonte:[argonavis]

  • DAO Data Access ObjectDescrio da SoluoData Access Object (DAO) oferece uma interface comum de acesso a dados e esconde as caractersticas de uma implementao especficaUma API: mtodos genricos para ler e gravar informaoMtodos genricos para concentrar operaes mais comuns (simplificar a interface de acesso)DAO define uma interface que pode ser implementada para cada nova fonte de dados usada, viabilizando a substituio de uma implementao por outraDAOs no mantm estado nem cache de dados

  • DAO Data Access ObjectDescrio da SoluoFonte:[argonavis]

  • DAO Data Access ObjectClient: objeto que requer acesso a dados: Business Object, Session Faade, Application Service, Value List Handler, ...DataAccessObject: esconde detalhes da fonte de dadosDataSource: implementao da fonte de dadosData: objeto de transferncia usado para retornar dados ao cliente. Poderia tambm ser usado para receber dados.ResultSet: resuldados de uma pesquisa no banco

  • DAO Data Access ObjectDiagrama de Seqncia

  • DAO Data Access ObjectMelhores estratgias de implementao (padres relacionados)Custom DAO StrategyEstratgia bsica. Oferece mtodos para criar, apagar, atualizar e pesquisar dados em um banco (CRUD).Pode usar Transfer Object para trocar dados com clientesDAO Factory Method StrategyUtiliza Factory Methods em uma classe para recuperar todos os DAOs da aplicaoDAO Abstract Factory StrategyPermite criar diversas implementaes de fbricas diferentes que criam DAOs para diferentes fontes de dados

  • DAO Data Access ObjectConseqnciasTransparncia quanto fonte de dadosFacilita migrao para outras implementaesBasta implementar um DAO com mesma interfaceReduz complexidade do cdigo nos objetos de negcio (ex: Entity Beans BMP)Centraliza todo acesso aos dados em camada separadaQualquer componente pode usar os dados (servlets, EJBs)Camada adicionalPode ter pequeno impacto na performanceRequer design de hierarquia de classes (Factory)

  • ConsideraesA distribuio em camadas e o padro DAO so excelentesPorm, normalmente uma tarefa difcil de ser implementadaAlm de bastante repetitivaORM com Hibernate visa facilitar essa implementao

  • RefernciasHibernate documentationHibernate in ActionCore Java Design Patterns

  • ExercciosPara no dizer que ficaremos sem eles hojeTestar os exemplos de reflexo mostrados no nicioVerificar o que deles podem ser reescritos usando os recursos do Java 5Testar nosso MySQL

  • Persistncia e mapeamento objeto relacionalJobson Ronan {[email protected]}