pec 8 hibernate mapeamentos

Upload: richard-lee

Post on 06-Apr-2018

249 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    1/38

    Hibernate componentes, herana,e associaes

    Jobson Ronan {[email protected]}

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    2/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    3/38

    Granularidade alta (fina) Fine-grained== mais classes que tabelas

    Mais coeso, mais reuso, modelo fcil de entender Freqentemente o melhor modelo de dados para uma tabela traduz-

    se em mais de uma classe Considere, por exemplo, uma tabela cliente com dois endereos:

    endereco_fatura e endereco_entrega, cidade_fatura, cidade_entrega, etc. Uma classe Endereco, agruparia campos relativos ao endereo de um Cliente,

    que teria propriedades enderecoFatura e enderecoEntrega como refernciaspara dois objetos da classe Endereco

    Uma coluna email poderia ser expandida em uma classe Email, para detalharum tipo de dados e encapsular validao de e-mail em vez de ser uma merapropriedade String do Cliente

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    4/38

    Tipos de objetos: entidade ou valor

    Um objeto do tipo entidade tem sua prpria identidade de registrode banco de dados Uma referncia para uma entidade tornada persistente como uma

    referncia no banco de dados (foreign key) Uma entidade pode existir independentemente de outra entidade

    Um objeto do tipo valorno tem identidade de banco de dados Pertence a uma entidade Seu estado persistente parte do registro da entidade que a possui No tm identificadores ou propriedades de identificao O tempo de vida limitado pelo tempo de vida da entidade que o possui Exemplos nativos: Strings, Integers, etc.

    Um dos objetos de um registro tem uma identidade prpria; osoutros so dependentes dele No exemplo anterior: objetos do tipo Cliente so entidades, objetos do tipo

    Endereco e Email so valores dependentes de um Cliente

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    5/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    6/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    7/38

    Mapeamento de componentes

    ...

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    8/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    9/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    10/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    11/38

    Uma tabela por classe concreta

    Ideal para classes que no fazem parte de uma hierarquiaou que esto na raiz de uma hierarquia (nvel mais alto) Essas classes no devem ser usadas em polimorfismo

    U

    ma declarao para cada classe concreta; um atributotable diferente para cada uma (igual a mapeamento simples)

    Desvantagens Pouco suporte para associaes polimrficas

    Queries polimrficos, executados em superclasses das classesusadas causam mltiplos queries nas tabelas mapeadas sclasses concretas

    Dificulta evoluo do esquema (mudanas semnticas empropriedades da superclasse afetam colunas de vrias tabelas)

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    12/38

    Queries gerados

    Os queries abaixo so conceituais (o SQL real gerado peloHibernate pode ser diferente)

    Dois queries para fazer uma pesquisa na superclasseB

    illingDetails (ineficiente!)select CREDIT_CARD_ID, OWNER, NUMBER, CREATED,TYPE, ... from CREDIT_CARD where CREATED = ?

    select BANK_ACCOUNT_ID, OWNER, NUMBER, CREATED,BANK_NAME, ... from BANK_ACCOUNT where CREATED=?

    Para fazer uma pesquisa numa classe concretaselect CREDIT_CARD_ID, TYPE, EXP_MONTH, EXP_YEAR

    from CREDIT_CARD where CREATED = ?

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    13/38

    Uma tabela por hierarquia

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    14/38

    Uma tabela por hierarquia Mapeia-se a hierarquia toda a uma nica tabela

    Tabela inclui uma coluna para identificar a classe (tipo); esta coluna(discriminator) no mapeada a uma propriedade mas usada internamentepelo Hibernate

    H colunas para todas as propriedades de todas as classes da hierarquia A classe raiz mapeada da forma convencional Subclasses so mapeadas dentro de como

    Vantagens Forma mais eficiente de implementar polimorfismo simples de implementar, entender e evoluir

    Desvantagens Colunas de propriedades declaradas em subclasses precisam aceitar valores

    nulos (no pode ser declarada not-null)

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    15/38

    Queries gerados

    Exemplo de query polimrfico (conceitual) na superclasse;um s query recupera dados de todas as subclassesselect BILLING_DETAILS_ID, BILLING_DETAILS_TYPE,

    OWNER, ..., CREDIT_CARD_TYPE, from

    BILLING_DETAILS where CREATED = ?

    Exemplo de um query em uma classe concretaselect BILLING_DETAILS_ID, CREDIT_CARD_TYPE,

    CREDIT_CARD_EXP_MONTH, ...

    from BILLING_DETAILSwhere BILLING_DETAILS_TYPE='CC' and CREATED = ?

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    16/38

    Mapeamento

    ...

    ...

    ...

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    17/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    18/38

    Uma tabela por subclasse

    Representa herana como relacionamentos de chaveestrangeira Cada subclasse que declara propriedades persistentes (inclusive

    interfaces e classes abstratas) tem sua prpria tabela Cada tabela possui colunas apenas para propriedades no-

    herdadas, e uma chave primria que chave estrangeira dasuperclasse

    Criao de uma instncia cria registros nas tabelas dasuperclasse e subclasse

    A recuperao dos dados realizada atravs de um join das

    tabelas (que pode conter outros elementos ) pode ser usada no lugar de ou dentro de

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    19/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    20/38

    Queries (conceituais) produzidos Bem mais complicados... Query na superclasse

    select BD.BILLING_DETAILS_ID, BD.CREATED, CC.TYPE, ..., BA.BANK_SWIFT, ...case

    when CC.CREDIT_CARD_ID is not null then 1when BA.BANK_ACCOUNT_ID is not null then 2

    when BD.BILLING_DETAILS_ID is not null then 0end as TYPEfrom BILLING_DETAILS BD

    left join CREDIT_CARD CC on BD.BILLING_DETAILS_ID= CC.CREDIT_CARD_IDleft join BANK_ACCOUNTBA on BD.BILLING_DETAILS_ID=BA.BANK_ACCOUNT_ID

    where BD.CREATED= ?

    Query na subclasse

    select BD.BILLING_DETAILS_ID, BD.CREATED, CC.TYPE, ... from CREDIT_CARD CCinner join BILLING_DETAILS BD on BD.BILLING_DETAILS_ID= CC.CREDIT_CARD_ID

    where CC.CREATED= ?

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    21/38

    Qual estratgia?

    Normalmente, usa-se uma combinao de estratgias Estratgias assumem desenvolvimento top-down (isto no

    integrao de um sistema legado)

    Se no houver necessidade de queries polimrficos ouassociaes, prefira Tabela por Classe Concreta Se houver necessidade de associaes polimrficas, use...

    ... Tabela por Hierarquia se as classes tiverem poucaspropriedades e for uma hierarquia simples

    ... Tabela por Subclasse se a hierarquia for mais complicada ouclasses tiverem muitas propriedades (ou ainda se as restriesde Tabela por Hierarquia como nulidade de colunas foreminaceitveis no modelo de dados)

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    22/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    23/38

    XML de mapeamento

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    24/38

    Associaes

    Associaes no Hibernate funcionam da mesma maneiraque associaes de objetos em Java Diferente de EJBs CMP, onde relacionamentos so gerenciados

    pelo container

    Associaes de objetos em Hibernate so unidirecionais e noso gerenciadas pelo container

    Associaes sempre so relacionamentos entre entidades Algumas so implementadas via colees

    Associaes um-para-muitos so as mais comuns Qualquer associao muitos-para-muitos pode ser implementada

    com um par de associaes um-para-muitos: mais simples! D para realizar quase tudo apenas com

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    25/38

    Multiplicidade de associaes

    A primeira classificao que fazemos de uma associao sua multiplicidade

    Exemplo H mais de um Lance (Bid) para um certo Item? H mais de um Item para um certo Lance?

    Concluso Existe uma associao de muitos para um de Bid para Item Por ser bidirecional, podemos dizer que tambm existe uma

    associao de um para muitos de Item para Bid: o item conhecetodos os lances feitos para ele.

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    26/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    27/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    28/38

    Tornando-a bidirecional

    Como encontrar todos os lances para um dado item? Associao bidirecional um para muitos: use um set!

    public class Item { ...private Set bids = new HashSet();

    public void setBids(Set bids) {this.bids = bids;

    }

    public Set getBids() {return bids;

    }

    public void addBid(Bid bid) {bid.setItem(this);bids.add(bid);

    }

    ...

    }

    ...

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    29/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    30/38

    Um para um

    Uma associao um para um pode ser declaradacom o elemento e/ou

    H dois tipos de relacionamentos um-para-um Associaes de chave estrangeira unvocas: a chave

    nunca se repete na classe associada usa elemento; usa tambm se forbidirecional.

    Associaes de chave primria: os dois objetoscompartilham a mesma chave primria usa apenaselementos

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    31/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    32/38

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    33/38

    Uso da associao bidirecional

    preciso modificar os dois lados!

    Transaction tx = session.beginTransaction();

    Category cat = (Category) session.get(Category.class, categoryId);

    Item item = (Item) session.get(Item.class, itemId);

    cat.getItems().add(item);

    item.getCategories().add(category);

    tx.commit();

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    34/38

    Associaes polimrficas

    Todas as associaes mostradas at agorasuportam polimorfismo No preciso fazer nada de especial para ter

    polimorfismo no Hibernate

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    35/38

    Colees polimrficas: exemplo

    ...

    CreditCard cc = new CreditCard();cc.setNumber(ccNumber);cc.setType(ccType);cc.setExpiryDate(ccExpiryDate);

    Session s = f.openSession();Transaction tx = s.beginTransaction();

    User user = (User) s.get(User.class, uid);// Call convenience methoduser.addBillingDetails(cc);

    tx.commit(); s.close();

    Session s = f.openSession();Transaction tx = s.beginTransaction();User user = (User) s.get(User.class, uid);

    Iterator i =user.getBillingDetails().iterator();

    while ( i.hasNext() ) {

    BillingDetails bd = (BillingDetails) i.next();// CreditCard.pay() or BankAccount.pay()bd.pay(ccPaymentAmount);

    }tx.commit(); s.close();

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    36/38

    Concluses

    Hibernate no ajuda s na implementao demodelos simples

    Hibernate implementa facilmente coisas que

    levariam semanas Associaes, composies e heranas no so mais

    problemas para a camada de persistncia

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    37/38

    Referncias

    Hibernate in Action Hibernate reference manual

    caveatemptor.hibernate.org

  • 8/3/2019 Pec 8 Hibernate Mapeamentos

    38/38

    Exerccio 1

    Implementar no Hibernate o seguinte modelo