Hibernate – componentes, herança, e associações Jobson Ronan

Slides:



Advertisements
Apresentações semelhantes
Análise e Projeto Orientado a Objetos
Advertisements

Java Avançado Luiz Carlos d´Oleron SJCP Hibernate II.
Transformação ODMG  Relacional
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
Estudo de Caso, modelo Oracle 10g
Modelo de Objetos ODMG.
Paulo Marques Hernâni Pedroso
Resumo 1.1) Introdução 1.2) Abordagem Convencional de Arquivos
O Modelo E-R Definição: Características
Maurício Edgar Stivanello
Sistema Gerenciador de Banco de Dados SGBD
Sistema Gerenciador de Banco de Dados SGBD
Modelagem Orientada a Objetos
Mapeamento Objeto Relacional
Introdução a Bancos de Dados
Refatorações Experiência é aquela coisa maravilhosa que permite que você reconheça um erro tão logo o cometa novamente F.P. Jones.
Introdução ao paradigma de programação: Orientado a Objetos
FRB - Maio 2002MCS9–1 Regras (Restrições) de Integridade Sistemas comerciais relacionais são muito finos de restrições para garantir a qualidade dos dados.
Caio Nakashima Hibernate Associação Caio Nakashima
Hibernate Apresentação
Java Persistence API (JPA) Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
Mapeamento Objeto-Relacional Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
Mapeamento de Objetos para Tabelas Relacionais
SQL Server 2012 Introdução a Modelagem de Dados
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
I- Introdução A Evolução dos Modelos de Dados e dos Sistemas de Gerência de Banco de Dados.
Transformação ODMG Relacional. Implementação Relacional de BDs OO Transformação Esquema Objeto Esquema Relacional Transformação Esquema Objeto Esquema.
Hibernate: Consultas Francisco do Nascimento
Design Patterns / Acesso ao banco de dados (java.sql)
Prof. Kelly E. Medeiros Bacharel em Sistemas de Informação
Hibernate Java avançado – PCC Jobson Ronan
Hibernate Java avançado – PCC Jobson Ronan
Estudo de Caso: um editor de documentos
III – O Modelo OR Estudo de Caso, modelo Oracle 10g.
Análise de Sistemas de Informação
SISTEMAS DISTRIBUIDOS Aula 4
A abordagem de banco de dados para gerenciamento de dados
Aula prática 14 Orientação a Objetos – C++ Parte 2
PostGres: Um Banco de Dados Orientado a Objetos
Projeto Orientado aos Objetos Prof. Wolley W. Silva
Análise Orientado aos Objetos Prof. Wolley W. Silva
Banco de Dados Aplicado ao Desenvolvimento de Software
Programação Orientada à Objetos
Campus de Caraguatatuba Aula 2: Introdução a Tecnologia de BD
Projeto de Sistemas de Informação Prof. Schneider Oracle Object-Relational.
Generalização e herança Agregação e composição
Persistência e mapeamento objeto relacional
IEC Banco de Dados I Aula 04 – SQL (II) Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho
Hibernate: Relacionamentos e Herança
Nilson de Souza Rego Jr.1 Persistência de Dados em.
Padrões de projeto M.Sc. Sílvio Bacalá Jr..
Objetos em Bancos de Dados Relacionais Alcides Calsavara.
Jobson Ronan Padrões GoF Jobson Ronan
Introdução a Orientação a Objetos
Classes abstratas São classes das quais não se pode instanciar objetos. São classes das quais não se pode instanciar objetos. Seu objetivo é ser herdada.
Modelagem Conceitual descreve a informação que o sistema vai gerenciar.
20/04/2017 Orientação a Objetos 1 1.
Projeto de Banco de Dados
Módulo II Capítulo 1: Orientação a Objetos
1 Database Systems, 8 th Edition Sistemas de Banco de Dados: Projeto, Implementação e gestão Oitava Edição Capítulo 2 Modelo de Dados.
1 Database Systems, 8 th Edition Sistemas de Banco de Dados: Projeto, Implementação e gestão Oitava Edição Capítulo 2 Modelo de Dados.
Projetar Base de Dados. Copyright © 2002 Qualiti. Todos os direitos reservados. Qualiti Software Processes Projetar base de dados | 2 Objetivos deste.
Diagrama de Classes Herança Dependências.
Transformação ODMG  Relacional. Implementação Relacional de BDs OO Transformação Esquema Objeto  Esquema Relacional.
Modelos de dados.
Desenvolvendo sotfware com UML1 Visão Geral de Orientação a Objetos.
CIn-UFPE1 Projeto de Gerenciamento de Dados. CIn-UFPE2 Objetivos n Definir o que significa gerenciamento de dados do sistema; n Entender abordagens diferentes.
Engenharia de Software Orientada a Objetos Professor: Guilherme Timóteo Aula 3: – Modelagem de Classes (parte 2)
Herança em Java Curso: Informática Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Programação para Internet Aula 11 SQL (Introdução a linguagem, comandos de modificação: Create, Drop, Alter, Insert, Delete, Update)
Transcrição da apresentação:

Hibernate – componentes, herança, e associações Jobson Ronan

Objetivos Aprender como realizar o mapeamento de modelos entidades que possuem associações, composições e herança com o hibernate

Granularidade alta (fina) Fine-grained == mais classes que tabelas  Mais coesão, mais reuso, modelo fácil de entender Freqüentemente o melhor modelo de dados para uma tabela traduz- se em mais de uma classe  Considere, por exemplo, uma tabela cliente com dois endereços: endereco_fatura e endereco_entrega, cidade_fatura, cidade_entrega, etc.  Uma classe Endereco, agruparia campos relativos ao endereço de um Cliente, que teria propriedades enderecoFatura e enderecoEntrega como referências para dois objetos da classe Endereco  Uma coluna poderia ser expandida em uma classe , para detalhar um tipo de dados e encapsular validação de em vez de ser uma mera propriedade String do Cliente

Tipos de objetos: entidade ou valor Um objeto do tipo entidade tem sua própria identidade de registro de banco de dados  Uma referência para uma entidade é tornada persistente como uma referência no banco de dados ( foreign key )  Uma entidade pode existir independentemente de outra entidade Um objeto do tipo valor não tem identidade de banco de dados  Pertence a uma entidade  Seu estado persistente é parte do registro da entidade que a possui  Não têm identificadores ou propriedades de identificação  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 própria; os outros são dependentes dele  No exemplo anterior: objetos do tipo Cliente são entidades, objetos do tipo Endereco e são valores dependentes de um Cliente

Componentes Um componente em Hibernate é a parte dependente de um objeto composto entidade-valor  Uma composição ocorre quando uma entidade, que tem identidade na tabela, está associada a objetos de valor que não têm identidade na tabela (seus dados são parte da tabela)  A remoção do registro no banco remove a entidade e seus componentes derivados (não confunda com cascade-delete) Um componente é uma propriedade  Meio termo entre uma propriedade de campo de dados (field) e uma propriedade que é referência em relacionamento  Componentes só existem como objetos, mas não como tabelas  Não confunda com componente de software (arquitetura)

Componentes e tabelas Os atributos do componente estão mapeados à mesma tabela que a classe composta

Mapeamento de componentes...

Limitações de componentes Classes mapeadas como componentes têm várias limitações  Não podem ter seus objetos compartilhados (não há como referir- se a eles pois não têm identidade própria)  Não existe maneira elegante de representar uma referência nula para um componente (é representado com valores nulos em todas as colunas do componente): se você gravar um componente não nulo com apenas valores nulos, Hibernate retorna null!

Mapeamento de herança Herança é o descasamento mais visível entre os mundos relacional e orientado a objetos  Mundo OO possui relacionamento “é um” e “tem um”  Mundo relacional apenas possui relacionamento “tem um” Há várias estratégias [Ambler 2002]*  Uma tabela por classe concreta : modelo relacional ignora herança e polimorfismo  Uma tabela por hierarquia de classes : permite polimorfismo com tabelas de-normalizadas mais uma coluna extra contendo informação de tipo  Uma tabela por subclasse : representa relacionamentos “é um” através de relacionamentos “tem um” (chave estrangeira)

Uma tabela por classe concreta

Ideal para classes que não fazem parte de uma hierarquia ou que estão na raiz de uma hierarquia (nível mais alto)  Essas classes não devem ser usadas em polimorfismo  Uma declaração para cada classe concreta; um atributo table diferente para cada uma (igual a mapeamento simples) Desvantagens  Pouco suporte para associações polimórficas  Queries polimórficos, executados em superclasses das classes usadas causam múltiplos queries nas tabelas mapeadas às classes concretas  Dificulta evolução do esquema (mudanças semânticas em propriedades da superclasse afetam colunas de várias tabelas)

Queries gerados Os queries abaixo são conceituais (o SQL real gerado pelo Hibernate pode ser diferente) Dois queries para fazer uma pesquisa na superclasse BillingDetails (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 concreta select CREDIT_CARD_ID, TYPE, EXP_MONTH, EXP_YEAR from CREDIT_CARD where CREATED = ?

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 ) não é mapeada a uma propriedade mas usada internamente pelo Hibernate  Há colunas para todas as propriedades de todas as classes da hierarquia  A classe raiz é mapeada da forma convencional  Subclasses são 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 (não pode ser declarada not-null)

Queries gerados Exemplo de query polimórfico (conceitual) na superclasse; um só query recupera dados de todas as subclasses select BILLING_DETAILS_ID, BILLING_DETAILS_TYPE, OWNER,..., CREDIT_CARD_TYPE, from BILLING_DETAILS where CREATED = ? Exemplo de um query em uma classe concreta select BILLING_DETAILS_ID, CREDIT_CARD_TYPE, CREDIT_CARD_EXP_MONTH,... from BILLING_DETAILS where BILLING_DETAILS_TYPE='CC' and CREATED = ?

Mapeamento <class name="BillingDetails" table="BILLING_DETAILS" discriminator-value="BD">

Uma tabela por subclasse

Representa herança como relacionamentos de chave estrangeira  Cada subclasse que declara propriedades persistentes (inclusive interfaces e classes abstratas) tem sua própria tabela  Cada tabela possui colunas apenas para propriedades não- herdadas, e uma chave primária que é chave estrangeira da superclasse  Criação de uma instância cria registros nas tabelas da superclasse e subclasse  A recuperação dos dados é realizada através de um join das tabelas  (que pode conter outros elementos ) pode ser usada no lugar de ou dentro de

Uma tabela por subclasse Vantagens  Modelo relacional normalizado  Evolução e restrições de integridade simples  Novas classes/tabelas criadas sem afetar classes/tabelas existentes Desvantagens  Performance baixa em hierarquias complexas  Mais difícil de codificar a mão (complicado de integrar com JDBC legado)

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 1 when BA.BANK_ACCOUNT_ID is not null then 2 when BD.BILLING_DETAILS_ID is not null then 0 end as TYPE from BILLING_DETAILS BD left join CREDIT_CARD CC on BD.BILLING_DETAILS_ID = CC.CREDIT_CARD_ID left join BANK_ACCOUNT BA 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 CC inner join BILLING_DETAILS BD on BD.BILLING_DETAILS_ID = CC.CREDIT_CARD_ID where CC.CREATED = ?

Qual estratégia? Normalmente, usa-se uma combinação de estratégias  Estratégias assumem desenvolvimento top-down (isto não é integração de um sistema legado) Se não houver necessidade de queries polimórficos ou associações, prefira Tabela por Classe Concreta Se houver necessidade de associações polimórficas, use... ... Tabela por Hierarquia se as classes tiverem poucas propriedades e for uma hierarquia simples ... Tabela por Subclasse se a hierarquia for mais complicada ou classes tiverem muitas propriedades (ou ainda se as restrições de Tabela por Hierarquia – como nulidade de colunas – forem inaceitáveis no modelo de dados)

Resumo: tags de mapeamento  Uma composição (objeto associado é dependente)  Usada para implementar a estratégia de mapeamento de herança “tabela por hierarquia de classe”  Usado para implementar a estratégia “table-per- subclass” onde cada subclasse tem sua própria tabela  Coluna e propriedade usada na estratégia “tabela por hierarquia de classe” para identificar a subclasse

XML de mapeamento

Associações Associações no Hibernate funcionam da mesma maneira que associações de objetos em Java  Diferente de EJBs CMP, onde relacionamentos são gerenciados pelo container  Associações de objetos em Hibernate são unidirecionais e não são gerenciadas pelo container Associações sempre são relacionamentos entre entidades  Algumas são implementadas via coleções Associações um-para-muitos são as mais comuns  Qualquer associação muitos-para-muitos pode ser implementada com um par de associações um-para-muitos: é mais simples!  Dá para realizar quase tudo apenas com

Multiplicidade de associações A primeira classificação que fazemos de uma associação é sua multiplicidade Exemplo  Há mais de um Lance (Bid) para um certo Item?  Há mais de um Item para um certo Lance? Conclusão  Existe uma associação de muitos para um de Bid para Item  Por ser bidirecional, podemos dizer que também existe uma associação de um para muitos de Item para Bid: o item conhece todos os lances feitos para ele.

Uma simples associação A associação unidirecional, muitos para um de Bid para Item é a mais simples possível  A referência retornada por Bid.getItem() é mapeada à coluna ITEM_ID na tabela BID, que é chave estrangeira da chave primária da tabela ITEM public class Bid {... private Item item; public void setItem(Item item) { this.item = item; } public Item getItem() { return item; }... }... <many-to-one name="item" column="ITEM_ID" class="Item" not-null="true"/> Se houver um lance (bid) o item tem que existir

Many-to-one é uma associação comum  O modelo relacional é many-to-one  Uma referência de objeto é many-to-one Alguns atributos:  name e column : nome da propriedade e coluna do banco  cascade : pode ter save-update, delete, all (informa que tipo de operação será repetida no objeto da associação)  outer-join : se true, objeto associado é carregado junto com o objeto pai; se ausente, o comportamento ocorre se objeto associado não estiver definido como um proxy.

Tornando-a bidirecional Como encontrar todos os lances para um dado item?  Associação 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); }... }...

 Este contém : uma coleção de registros – mapeado diretamente à tabela! Representa uma relação um para muitos no modelo relacional  Mapeamento direto: atributo class informa a classe (não é preciso informar colunas nem nome da tabela – o mapeamento da classe referida já tem essa informação!)

Um para um Uma associação um para um pode ser declarada com o elemento e/ou Há dois tipos de relacionamentos um-para-um  Associações de chave estrangeira unívocas: a chave nunca se repete na classe associada – usa elemento ; usa também se for bidirecional.  Associações de chave primária: os dois objetos compartilham a mesma chave primária – usa apenas elementos

Associação muitos para muitos unidirecional... <set name="items" table="CATEGORY_ITEM" lazy="true" cascade="save-update"> Transaction tx = session.beginTransaction(); Category cat = (Category) session.get(Category.class, categoryId); Item item = (Item) session.get(Item.class, itemId); cat.getItems().add(item); tx.commit();

Muitos para muitos bidirecional... <many-to-many class="org.hibernate.auction.Item" column="ITEM_ID"/>... <many-to-many class="org.hibernate.auction.Category“ column="CATEGORY_ID"/>

Uso da associação 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();

Associações polimórficas Todas as associações mostradas até agora suportam polimorfismo  Não é preciso fazer nada de especial para ter polimorfismo no Hibernate

Coleções polimórficas: exemplo <many-to-one name="user" class="User" column="USER_ID"/>... <set name="billingDetails" lazy="true" cascade="save-update" inverse="true"> 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 method user.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();

Conclusões Hibernate não ajuda só na implementação de modelos simples Hibernate implementa facilmente coisas que levariam semanas Associações, composições e heranças não são mais problemas para a camada de persistência

Referências Hibernate in Action Hibernate reference manual caveatemptor.hibernate.org

Exercício 1 Implementar no Hibernate o seguinte modelo