UFG - Instituto de Informática



Documentos relacionados
Persistência com JPA2 e Hibernate TREINAMENTOS

Persistência de dados com JPA. Hélder Antero Amaral Nunes

UFG - Instituto de Informática

Aula 2 - Revisão de JPA (Java Persistence API)

UFG - Instituto de Informática

Orientação a Objetos

Hibernate. Mapeamento Objeto-Relacional. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior


Aula 2 - Revisão de JPA (Java Persistence API)

Introdução à JPA-Java Persistence API

Módulo 03. Mapeando Associações/Relacionamentos. Raphaela Galhardo.

JPA: Persistência padronizada em Java

Persistência de Dados em Java com JPA e Toplink

Introdução a Java. Hélder Nunes

Hibernate. Mapeamento O/R Marcio Aguiar Ribeiro

Orientação a Objetos

1. Domínio dos Atributos

Banco de Dados Modelo Conceitual, Lógico, Físico, Entidade- Relacionamento (ER) Hélder Nunes

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Noções sobre Objetos e Classes

Modelagem de Banco de Dados através do ERwin

JPA Passo a Passo. Henrique Eduardo M. Oliveira henrique@voffice.com.br. Globalcode Open4Education

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

UFG - Instituto de Informática

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Etc & Tal. Volume 2 - Número 1 - Abril 2009 SBC HORIZONTES 44

Oficina. Praça das Três Caixas d Água Porto Velho - RO

Capítulo 22. Associações entre Classes. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Programação de Computadores - I. Profª Beatriz Profº Israel

MODELAGEM VISUAL DE OBJETOS COM UML DIAGRAMA DE CLASSES.

JSP - ORIENTADO A OBJETOS

Disciplina: Unidade V: Prof.: Período:

Mapeando Entidades. Abaixo iremos mapear nossas classes. Fornecedor.java package entidades;

3 Classes e instanciação de objectos (em Java)

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Capítulo 11. Conceitos de Orientação a Objetos. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Linguagem de Programação III

2 Orientação a objetos na prática

Apresentação... Nome: Vanderlei Cordeiro Frazão

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

UFG - Instituto de Informática

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

SQL - Criação de Tabelas

Hibernate Envers Easy Entity Auditing

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01

UD 4: Sistema de Gerenciamento de Banco de Dados

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

VIII. VARIÁVEIS. Tabela I ARQUITETURA DA MEMÓRIA. 0x0000 0x34 0x0001 0xB0 0x0002 0x23. 0xFFFF 0x00

LINGUAGEM DE BANCO DE DADOS

Persistindo dados com TopLink no NetBeans

Disciplina de Banco de Dados Parte V

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

Construindo portais com Plone

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Modelo Entidade-Relacionamento

Java Persistence API. Entity Entity Campos e Propriedades Entity Chaves Primárias Entity Associações

Mapeamento Lógico/Relacional com JPA

Introdução ao SQL. O que é SQL?

Aula 4. Carlos Eduardo de Carvalho Dantas

Programação Orientada a Objetos

ALTO DESEMPENHO UTILIZANDO FRAMEWORK HIBERNATE E PADRÃO JAVA PERSISTENCE API

Prof. Marcelo Machado Cunha

Especificação do 3º Trabalho

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

Modelo de Dados Relacional Restrições de um Banco de Dados Relacional

MYSQL: TIPOS DE DADOS. Gilvan Vieira Moura

Lógica de Programação

BANCO DE DADOS. Fixação dos conteúdos Integridade Referencial Normalização Exercícios

DBDesigner 4. NomeFunc 1,N FUNCIONÁRIO. CargaHoraria. MatrFunc

Especificação do Trabalho

Profa. Daniela Barreiro Claro

Roteiro do Programa e Entrada/Saída

Framework utilizando reflexão e aspectos para persistência de objetos em java

Banco de Dados. Arquitetura e Terminologia. Prof. Walteno Martins Parreira Jr waltenomartins@yahoo.

Métodos Os métodos de uma classe podem ser classificados como construtores, destrutores, funções ou procedimentos.

GESTÃO DE VEÍCULOS. Cadastro de Veículos e Grupos de Controle

Programação de Computadores - I. Profª Beatriz Profº Israel

Microsoft Access Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento

Estruturas (registros)

Unidade IV: Ponteiros, Referências e Arrays

Banco de Dados Aula 1 Introdução a Banco de Dados Introdução Sistema Gerenciador de Banco de Dados

E/S CPU. Memória (Instruções e dados) 2 PARADIGMA IMPERATIVO. Instruções e dados. Resultados das operações. Unidade lógica e aritmética

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

FTIN FORMAÇÃO TÉCNICA EM INFORMÁTICA. Módulo de Programação Prof. Bruno Maciel

BANCO DE DADOS I AULA 3. Willamys Araújo

Linguagem de Programação I. Orientação a Objetos em Java

BASES DE DADOS I LTSI/2. Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

Disciplina: Unidade III: Prof.: Período:

Programação SQL. Introdução

Linguagem e Técnicas de Programação I Tipos de dados, variáveis e constantes. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

Roteiro. Modelo de Dados Relacional. Processo de Projeto de Banco de Dados. BCC321 - Banco de Dados I. Ementa. Posicionamento.

Databases. Ferramentas gráficas na modelação lógica das BD. O Modelo Entidade-Relação (Associação) O Modelo de Classes no UML

Auditoria Avançada de Persistência com Hibernate, JPA e Envers

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Transcrição:

UFG - Instituto de Informática Curso: Engenharia de Software Arquitetura de Software Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 9 Mapeamento em JPA

Introdução O mapeamento objeto-relacional é o coração do JPA. Ele define quais transformações devem ser realizadas nos dados para que essas informações possam navegar da aplicação para o banco de dados ou do banco de dados para a aplicação. Em particular, o mapeamento determina como a ferramenta ORM fará consultas complexas envolvendomais do que uma tabela.

Entidades As classes da nossa aplicação que devem ser mapeadas para tabelas do banco de dados são anotadas com @Entity. Cada instância de uma classe anotada com @Entity deve possuir um identificador único. Em geral, esse identificador é um atributo numérico que deve ser anotado com @Id.

Entidades - Exemplo 2 class Pessoa { 4 private Long id; 5 }

Entidades - Mapeamento a) b) Figura 2.1: Tabelas correspondentes à classe Pessoa. Em (a), os nomes da tabela e da coluna são padrões. Em (b), esses nomes são personalizados.

Entidades Por convenção, a classe Pessoa será mapeada para uma tabela com o mesmo nome (Pessoa). O atributo id será mapeado para uma coluna com o mesmo nome (id) na tabela Pessoa. As anotações @Table e @Column podem ser usadas para personalizar os nomes das tabelas e das colunas. A coluna correspondente ao atributo id será definida como chave primária da tabela Pessoa devido a presença da anotação @Id.

Entidades - Exemplo 2 @Table ( name = " tbl_pessoas ") 3 class Pessoa { 4 @Id 5 @Column ( name = " col_id ") 6 private Long id; 7 }

Mapeamento Podemos definir algumas restrições para os atributos das nossas entidades através das propriedades da anotação @Column. length nullable unique precision scale Limita a quantidade de caracteres de uma string Determina se o campo pode possuir valores null ou não Determina se uma coluna pode ter valores repetidos ou não Determina a quantidade de digitos de um número decimal a serem armazenados Determina a quantidade de casas decimais de um número decimal

Mapeamento - Exemplo No exemplo a seguir, associamos três restrições ao atributo nome da classe Pessoa. O nome deve possuir no máximo 30 caracteres, não pode ser nulo e duas pessoas não podem ter o mesmo nome. Além disso, definimos que a altura das pessoas será representada por um número de três dígitos, sendo dois deles referentes às casas decimais.

Mapeamento Exemplo 2 class Pessoa { 4 private Long id; 5 6 @Column ( length =30, nullable = false, unique = true ) 7 private String nome ; 8 9 @Column ( precision =3, scale =2) 10 private BigDecimal altura ; 11 }

Mapeamento Chaves Primárias automáticas Em geral, os bancos de dados oferecem algum mecanismo para gerar os valores de uma chave primária simples e numérica. Do ponto de vista do desenvolvedor JPA, basta aplicar a anotação @GeneratedValue para que o banco gere os valores de uma chave primária simples e numérica automaticamente.

Mapeamento - Exemplo 2 class Pessoa { 4 @GeneratedValue 6 }

Mapeamento Automático Cada banco possui o seu próprio conjunto de tipos de dados. Para que as informações possam navegar da aplicação para o banco e vice-e-versa, os tipos do Java devem ser mapeados para tipos apropriados do banco de dados.

Mapeamento Automático Alguns tipos do Java são mapeados automaticamente para tipos correspondentes do banco de dados. Eis uma lista dos tipos que são mapeados automaticamente: Tipos primitivos (byte, short, char, int, long, float, double e boolean) ClassesWrappers (Byte, Short, Character, Integer, Long, Float, Double e Boolean) String BigInteger e BigDecimal java.util.date e java.util.calendar java.sql.date, java.sql.time e java.sql.timestamp Array de byte ou char Enums Serializables Esses tipos são chamados de tipos básicos.

Objetos Grandes (LOBs) Eventualmente, dados maiores do que o comum devem ser armazenados no banco de dados. Por exemplo, uma imagem, uma música ou um texto com muitas palavras. Para esses casos, os bancos de dados oferecem tipos de dados específicos. Do ponto de vista do desenvolvedor JPA, basta aplicar a anotação @LOB (Large Objects) em atributos do tipo String, byte[], Byte[], char[] ou Character[] para que o provedor (Hibernate, EclipseLink ou outra implementação de JPA) utilize os procedimentos adequados para manipular esses dados.

Mapeamento - Exemplo 2 class Pessoa { 4 @GeneratedValue 6 7 @Lob 8 private byte [] avatar ; 9 }

Mapeamento Data e Hora Comumente, as aplicações Java utilizam as classes java.util.date e java.util.calendar para trabalhar com datas e horas. Essas classes são mapeadas automaticamente para tipos adequados no banco de dados. Portanto, basta declarar os atributos utilizando um desses dois tipos nas classes que serão mapeadas para tabelas.

Mapeamento - Exemplo 2 class Pessoa { 4 @GeneratedValue 6 7 private Calendar nascimento ; 8 }

Mapeamento Data e Hora Por padrão, quando aplicamos o tipo java.util.date ou java.util.calendar, tanto a data quanto a hora serão armazenadas no banco de dados. Para mudar esse comportamento, devemos aplicar a anotação @Temporal escolhendo uma das três opções abaixo: TemporalType.DATE: Armazena apenas a data (dia, mês e ano). TemporalType.TIME: Armazena apenas o horário (hora, minuto e segundo). TemporalType.TIMESTAMP (Padrão): Armazena a data e o horário.

Mapeamento - Exemplo 2 class Pessoa { 4 @GeneratedValue 6 7 @Temporal ( TemporalType. DATE ) 8 private Calendar nascimento ; 9 }

Dados Transientes Eventualmente, não desejamos que alguns atributos de um determinado grupo de objetos sejam persistidos no banco de dados. Nesse caso, devemos aplicar o modificador transient ou a anotação @Transient. No próximo exemplo, marcamos o atributo idade com a anotação @Transient para que essa informação não seja armazenada no banco de dados. A idade de uma pessoa pode ser deduzida a partir de sua data de nascimento, que já está armazenada no banco.

Mapeamento Exemplo 2 class Pessoa { 4 @GeneratedValue 6 7 @Temporal ( TemporalType. DATE ) 8 private Calendar nascimento ; 9 10 @Transient 11 private int idade ; 12 }

Mapamento Tipos Enumerados Por padrão, os tipos enumerados de JAVA são mapeados para colunas numéricas inteiras no banco de dados. Cada elemento de um Enum é associado a um número inteiro. Essa associação é baseada na ordem em que os elementos do Enum são declarados. O primeiro elemento será associado ao valor 0, o segundo será associado ao valor 1 e assim por diante.

Mapeamento - Exemplo 2 public enum Periodo { 3 MATUTINO, 4 NOTURNO 5 } 2 public class Turma { 4 @GeneratedValue 6 7 private Periodo periodo ; 8 } O Enum Periodo possui dois elementos: MATUTINO e NOTURNO. O elemento MATUTINO será associado ao valor 0 e o elemento NOTURNO será associado ao valor 1.

Mapeamento Tipos Enumerados Para evitar esse problema, podemos fazer com que os elementos de um Enum sejam associados a uma string ao invés de um número inteiro. Isso pode ser feito com o uso da anotação @Enumerated. 2 public class Turma { 4 @GeneratedValue 6 7 @Enumerated ( EnumType. STRING ) 8 private Periodo periodo ; 9 }

Coleções Considere um sistema que controla o cadastro dos funcionários de uma empresa. Esses funcionários são modelados pela seguinte classe. 2 public class Funcionario { 3 4 @Id @GeneratedValue 6 7 private String nome ; 8 }

Coleções Devemos também registrar os telefones de contato dos funcionários, sendo que cada funcionário pode ter um ou mais telefones. Em Java, seria razoável utilizar coleções para armazenar os telefones dos funcionários.

Coleções - Exemplo 2 public class Funcionario { 3 4 @Id @GeneratedValue 6 7 private String nome ; 8 9 @ElementCollection 10 private Collection <String> telefones ; 11 }

Coleções A anotação @ElementCollection deve ser utilizada para que omapeamento seja realizado. Nesse exemplo, o banco de dados possuiria uma tabela chamada Funcionario_telefones contendo duas colunas. Uma coluna seria usada para armazenar os identificadores dos funcionários e a outra para os telefones.

Coleções - Mapeamento

Coleções A tabela criada para guardar os telefones dos funcionários também pode ter o seu nome personalizado, assim como os nomes de suas colunas. Para isso, devemos aplicar as anotações @Collection-Table e @Column. 2 public class Funcionario { 3 4 @Id @GeneratedValue 6 7 private String nome ; 8 9 @ElementCollection 10 @CollectionTable ( 11 name =" Telefones_dos_Funcionarios ", 12 joincolumns = @JoinColumn ( name =" func_id ")) 13 @Column ( name =" telefone ") 14 private Collection < String > telefones ; 15 }

Relacionamentos Os relacionamentos entre as entidades de um domínio devem ser expressos na modelagem através de vínculos entre classes. De acordo com a JPA, podemos definir quatro tipos de relacionamentos de acordo com a cardinalidade.

Relacionamentos - Tipos One to One (Um para Um): Por exemplo, um estado é governado por apenas um governador e um governador governa apenas um estado. One to Many (Um para Muitos): Por exemplo, um departamento possui muitos funcionários e um funcionário trabalha em apenas em um departamento. Many to One (Muitos para Um): Por exemplo, um pedido pertence a apenas um cliente e um cliente faz muitos pedidos. Many to Many (Muitos para Muitos): Por exemplo, um livro possui muitos autores e um autor possui muitos livros.

One to One Suponha que em nosso domínio existam duas entidades: Estado e Governador. Devemos criar uma classe para cada entidade e aplicar nelas as anotações básicas de mapeamento. 2 class Estado { 4 @GeneratedValue 6 } 2 class Governador { 4 @GeneratedValue 6 }

One to One Como existe um relacionamento entre estados e governadores, devemos expressar esse vínculo através de um atributo que pode ser inserido na classe Estado. 2 class Estado { 4 @GeneratedValue 6 7 private Governador governador ; 8 }

One to One Além disso, devemos informar ao provedor JPA que o relacionamento que existe entre um estado e um governador é do tipo One to One. Fazemos isso aplicando a anotação @OneToOne no atributo que expressa o relacionamento. 2 class Estado { 4 @GeneratedValue 6 7 @OneToOne 8 private Governador governador ; 9 }

One to Many Suponha que em nosso domínio existam as entidades Departamento e Funcionário. Criaríamos duas classes com as anotações básicas demapeamento. 2 class Departamento { 4 @GeneratedValue 6 } 2 class Funcionario { 4 @GeneratedValue 6 }

One to Many Como existe um relacionamento entre departamentos e funcionários, devemos expressar esse vínculo através de um atributo que pode ser inserido na classe Departamento. Supondo que um departamento possa ter muitos funcionários, devemos utilizar uma coleção para expressar esse relacionamento.

One to Many 2 class Departamento { 4 @GeneratedValue 6 7 private Collection < Funcionario > funcionarios ; 8 }

One to Many Para informar a cardinalidade do relacionamento entre departamentos e funcionários, devemos utilizar a anotação @OneToMany na coleção. 2 class Departamento { 4 @GeneratedValue 6 7 @OneToMany 8 private Collection < Funcionario > funcionarios ; 9 }

Many to One Suponha que em nosso domínio existam as entidades Pedido e Cliente. As duas classes que modelariam essas entidades seriam definidas com as anotações principais de mapeamento.

Many to One @Entity 2 class Pedido { 4 @GeneratedValue 6 } 2 class Cliente { 4 @GeneratedValue 6 }

Many to One Como existe um relacionamento entre pedidos e clientes, devemos expressar esse vínculo através de um atributo que pode ser inserido na classe Pedido. Supondo que um pedido pertença a um único cliente, devemos utilizar um atributo simples para expressar esse relacionamento. 2 class Pedido { 4 @GeneratedValue 6 7 private Cliente cliente ; 8 }

Many to One Para informar a cardinalidade do relacionamento entre pedidos e clientes, devemos utilizar a anotação @ManyToOne no atributo. 2 class Pedido { 4 @GeneratedValue 6 7 @ManyToOne 8 private Cliente cliente ; 9 }

Many to Many Suponha que em nosso domínio existam as entidades Livro e Autor. As classes com as anotações básicas de mapeamento seriam mais ou menos assim: 2 class Livro { 4 @GeneratedValue 6 } 2 class Autor { 4 @GeneratedValue 6 }

Many to Many Como existe um relacionamento entre livros e autores, devemos expressar esse vínculo através de um atributo que pode ser inserido na classe Livro. Supondo que um livro possa ser escrito por muitos autores, devemos utilizar uma coleção para expressar esse relacionamento.

Many to Many 2 class Livro { 4 @GeneratedValue 6 7 private Collection <Autor > autores ; 8 }

Many to Many Para informar a cardinalidade do relacionamento entre livros e autores, devemos utilizar a anotação @ManyToMany na coleção. 2 class Livro { 4 @GeneratedValue 6 7 @ManyToMany 8 private Collection <Autor > autores ; 9 }

Many to Many