Mapeamento da herança em JPA

Documentos relacionados
Mapeamento da herança em JPA

Herança entre Entidades JPA. Prof. Fellipe Aleixo

@Table(name= Nome-da-tabela ) usada quando os nomes da classe e da tabela são diferentes.

Introdução. Configuração. Padrão POJO. Framework Pesistência de. Mapeamento Annotation. Objetos. Persistência. Java. Objetos. Prof.

Persistência de Objetos

JPA Demonstração das estratégias optimistic locking e pessimistic locking

Mapeamento Lógico/Relacional com JPA

Sumário. SQL - Criação de Tabelas. Structured Query Language. SQL Versões. André Restivo. October 18, 2010

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

JPA Demonstração das Estratégias Optimistic Locking e Pessimistic Locking

JPA Com Hibernate. Paulo Ricardo Lisboa de Almeida. 1 Universidade Positivo

Repositórios JPA no Projeto ecafeteria

Programação Java (nível intermediário) 4. Polimorfismo

Criar uma aplicação JPA2 com EclipseLink e H2

Computação II Orientação a Objetos

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Atributos e Métodos Estáticos

Herança e Propriedades

Resolvendo objeto-relacional impedance mismatch com hibernate

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Vamos falar de Hibernate?

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

COMPORTAMENTOS - Observações

Aula 7 SBD ER para Relacional. Profa. Elaine Faria UFU

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

4 Conceito de Herança

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

JPA DAO Genérico e JPQL

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Testes Automatizados com Banco de Dados

MAPEAMENTO OBJETO RELACIONAL. Professora Lucélia Oliveira

Polimorfismo. O que é polimorfismo?

Programação Orientada a Objetos SANTOS, Rafael

MAPEAMENTO OBJETO RELACIONAL

Java 2 Standard Edition Classes internas

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Testes Automatizados e Bancos de Dados

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

6 Polimorfismo. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Sistemas de Banco de Dados Prof. Flávio de Oliveira Silva, M.Sc. O esquema de uma relação é escrito da seguinte forma:

Palavras Reservadas da Linguagem Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Armazenando Dados em Aplicações Java Parte 3 de 3: Analisando as opções

Linguagem de Programação. Diagrama de classes

JPA Com Hibernate Aula 2

Mapeando Relacionamentos Entre Classes com Anotações Hibernate Por: Raphaela Galhardo Fernandes Gleydson de Azevedo F. Lima

Programação Orientada a Objetos II

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

9 Classes Abstractas e Interfaces

Programação Orientada a Objetos SANTOS, Rafael (PLT)

Enums em Java: utilização e persistência

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação por Objectos. Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos. Herança

Extensão de classes em Java - noções elementares - PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa

JPA Java Persistence API. Prof. Ramon Chiara

JAVA ENTERPRISE EDITION: CRIAR BEANS DE ENTIDADE A PARTIR DE TABELAS

Herança e Polimorfismo

Aula 4 Encapsulamento e Relacionamento Cleverton Hentz

Linguagem de programação Programação Orientada a objetos

IEC Banco de Dados I Aula 09 Modelo E. R. para relacional

Agenda. Instalação e configuração. Processamento de comandos SQL com JDBC. Driver JDBC Criação da classe de conexão

Interfaces POO. Prof. Marcio Delamaro

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Lição 11 Herança, polimorfismo e interfaces

Rápida revisão do Modelo Relacional

A Relação de Subtipo e Tipos Genéricos

Interfaces e Classes Internas

AULA TEÓRICA 9. Tema 8. Herança (continuação) Ø Sobreposição de métodos. Ø Variáveis e métodos estáticos. Ø Hierarquia de classes.

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Programação por Objectos. Java

1 Introdução e Conceitos básicos

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Relacionamentos entre objetos

Polimorfismo e Ligação Dinâmica. Alcides Pamplona Polimorfismo e Ligação Dinâmica

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

DATA ACCESS OBJECT (DAO)

Programação Java. - Classes, Objetos, Atributos e Métodos - Marco Fagundes Marco Fagundes -

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Orientação a Objetos AULA 09

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Introdução à Programação Orientada por Objectos em Java. Enquadramento e Objectivos Abstracção Encapsulamento Herança Polimorfismo Conclusão

Transcrição:

Mapeamento da herança em JPA Impedance mismatch é o termo usado para descrever as dificuldades em mapear o estado de um objecto num registo de uma tabela de uma base de dados relacional. Na modelação orientada a objectos, a herança é talvez a característica onde é maior a impedance mismatch, porque não há nenhum modo natural e eficiente de representar uma relação de herança numa base de dados relacional. JPA permite escolher uma de entre 3 estratégias para a herança: SINGLE_TABLE, JOINED e TABLE_PER_CLASS. Na classe da entidade base define-se a estratégia de herança para a hierarquia com uma anotação Inheritance: @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @Inheritance(strategy=InheritanceType.JOINED) @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) O enum InheritanceType define 3 valores para declarar a estratégia da herança para a hierarquia: InheritanceType.SINGLE_TABLE InheritanceType.JOINED InheritanceType.TABLE_PER_CLASS O valor por omissão é InheritanceType.SINGLE_TABLE. Usando as estratégias SINGLE_TABLE ou JOINED na tabela correspondente à classe base é criada uma coluna discriminadora (nome por omissão DTYPE ), tendo como valor para cada registo o nome da classe a que o registo pertence (uma única coluna para distinguir a que classe cada registo pertence). Single Table A estratégia Single_Table mapeia todas as classes da hierarquia na tabela da classe base. Para qualquer estratégia, a anotação que define a estratégia de mapeamento só se coloca na superclasse, mas como a estratégia por omissão é single table, para usar esta estratégia podemos omitir a anotação @Inheritance. Na tabela de mapeamento é criada uma coluna para cada campo de dados de cada classe da hierarquia. Quanto maior for a hierarquia (larga ou profunda), mais larga será a tabela mapeada, o que poderá ter consequências no tamanho da base de dados com muitas colunas bastante vazias. No entanto o mapeamento single table é o mais rápido de entre todos os modelos de mapeamento de herança porque para retribuir uma instância nunca necessita de efectuar um join e para persistir ou atualizar uma instância necessita apenas de um insert ou um update.

Esta opção fornece o melhor suporte quer para relações polimórficas entre entidades, quer para queries abrangendo toda a hierarquia. Este mapeamento em que todos os objetos da hierarquia são mapeados na tabela da superclasse designa-se por mapeamento da hierarquia plano. Joined A estratégia Joined usa uma tabela diferente para cada classe da hierarquia. Cada tabela só inclui o estado declarado na própria classe. A raiz da hierarquia de classes é representada por uma única tabela e cada subclasse é representada por uma tabela separada. Cada tabela de uma subclasse contém apenas os campos definidos na subclasse (não contém os herdados das superclasses) e colunas chaves primárias que servem como chaves estrangeiras para as chaves primárias da tabela da superclasse. Assim para retribuir uma instância de uma subclasse, JPA tem de ler da tabela dessa subclasse assim como das tabelas das superclasses até à classe entidade base. O mapeamento Joined é o mais lento de entre todos os modelos de mapeamento de herança porque para retribuir uma instância necessita de efectuar um ou mais joins e para persistir ou atualizar uma instância de uma subclasse necessita de vários inserts ou updates. No entanto resulta no esquema de base de dados mais normalizado de entre todos os modelos de mapeamento de herança. Este mapeamento designa-se por mapeamento da hierarquia vertical. Table per class A estratégia Table_per_Class usa uma tabela diferente para cada classe concreta da hierarquia, semelhante à estratégia joined. Mas, ao contrário da estratégia joined, cada tabela inclui todo o estado de uma instância da correspondente classe, e só cria tabelas para as classes concretas. Todas as propriedades das instâncias de uma classe, incluindo propriedades herdadas, são mapeadas para colunas da tabela correspondente a essa classe. Assim para retribuir uma instância de uma subclasse, JPA tem de ler apenas da tabela dessa subclasse. Não necessita de efetuar join com as tabelas das superclasses. Esta estratégia tableper-class é muito eficiente para todas as operações sobre instâncias de classes conhecidas, isto é na ausência de comportamento polimórfico. Relações polimórficas têm muitas limitações.

Consideremos uma hierarquia para representar Movimentos (classe Movement) de contas bancárias: Despesas (classe Expense) e Receitas (classe Income). Estratégia Single Table Tabela MOVEMENT: ID DTYPE AMOUNT DATEOCURRED DESCRIPTION EXPENSETYPE INCOMETYPE 1 Expense 150 2016-02-05 calças Clothing <NULL> 2 Expense 66 2016-02-15 camisa Clothing <NULL> 3 Expense 35 2016-02-01 Passe Metro Transports <NULL> 4 Income 200 2016-01-31 Venc Janeiro <NULL> Salary

Estratégia JOINED @Inheritance(strategy=InheritanceType.JOINED) Tabela MOVEMENT: ID DTYPE AMOUNT DATEOCURRED DESCRIPTION 1 Expense 150 2016-02-05 calças 2 Expense 66 2016-02-15 camisa 3 Expense 35 2016-02-01 Passe Metro 4 Income 200 2016-01-31 Venc Janeiro Tabela EXPENSE: ID EXPENSETYPE 1 Clothing 2 Clothing 3 Transports Foreign Keys: FK_EXPENSE_ID ID -> MOVEMENT.ID Tabela INCOME: ID INCOMETYPE 4 Salary Foreign Keys: FK_INCOME_ID ID -> MOVEMENT.ID

Estratégia TABLE_PER_CLASS @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) Tabela EXPENSE: ID AMOUNT DATEOCURRED DESCRIPTION EXPENSETYPE 1 150 2016-02-05 calças Clothing 2 66 2016-02-15 camisa Clothing 3 35 2016-02-01 Passe Metro Transports Tabela INCOME: ID AMOUNT DATEOCURRED DESCRIPTION INCOMETYPE 1 200 2016-01-31 Venc Janeiro Salary Se a classe Movement não tivesse sido declarada como abstract esta estratégia criaria também uma tabela MOVEMENT. Caso não se criasse nenhum objeto Movement essa tabela ficaria vazia.

Programa completo: public Movement() { public Movement(String description, BigDecimal amount, Date dateocurred) { this.description = description; this.amount = amount; this.dateocurred = dateocurred; public Expense() { public Expense(String description, BigDecimal amount, Date dateocurred, String expensetype) { super(description, amount, dateocurred); this.expensetype = expensetype; public Income() { public Income(String description, BigDecimal amount, Date dateocurred, String incometype) { super(description, amount, dateocurred); this.incometype = incometype; public class JPA { public static void main(string[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA2PU"); EntityManager em = emf.createentitymanager(); Expense e1 = new Expense( "Passe Metro", new BigDecimal(35), newdate(2016, 2, 1), "Transports"); Expense e2 = new Expense( "camisa", new BigDecimal(66), newdate(2016, 2, 15), "Clothing"); Expense e3 = new Expense( "calças", new BigDecimal(150), newdate(201, 2, 2), "Clothing"); Income i1 = new Income( "Venc Janeiro", new BigDecimal(200), newdate(2016, 1, 31), "Salary"); em.gettransaction().begin(); em.persist(e1); em.persist(e2); em.persist(e3); em.persist(i1); em.gettransaction().commit(); em.close(); emf.close(); public static Date newdate(int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month - 1, day); return c.gettime();