P ERSI ERSI STENCIA TENCIA COM JAVA J AVA
JPA J P A – JJava a v a PPersi Per ersistence ersist sist sten ence ce API AP I Mapeamento Mapea Map eame ment nto o OR com c om Anotações Hibernate como co mo Prov Pro v eedor ed dor do orr de Persistência
Prof. P rof. Jaqson Jaq son Dalbosco Dalb Dalbosc osco o
[email protected]
PERSISTÊNCII A COM PERSISTÊNC COM JA VA
Mapeamento Objeto Relacional Relacional (ORM (ORM))
Mapeamento ObjetoObjeto-Relacional Relacional Lingu inguag ageens de Prog Progrramação ação orie orient ntad adas as a obje objeto toss e SGBD SGBDss relacionais = complexidade de implementação
•
2
PERSISTÊNCII A COM PERSISTÊNC COM JA VA
Mapeamento Objeto Relacional Relacional (ORM (ORM))
Mapeamento ObjetoObjeto-Relacional Relacional Lingu inguag ageens de Prog Progrramação ação orie orient ntad adas as a obje objeto toss e SGBD SGBDss relacionais = complexidade de implementação
•
2
PERSISTÊNCII A COM PERSISTÊNC COM JA VA
Mapeamento Objeto Relacional Relacional (ORM (ORM))
Requisitos P ar ara tra b al h a r co m o d e sen vo lvi m en to d e si s tem a s OO co m SG B D s rela relacc i onai on aiss e m Jav Ja v a, é pre pre c iso: iso: a ) implementar as classes persistentes do sistema seguindo um Design Pattern (padrão de projeto) adotado pelos frameworks de persistência; b ) dispor de frameworks que realizem todo o trabalho pesado da c ) disp dispor or de AP APIs Is que que disp dispon onib ibili ilize zem m clas classe sess e inte interf rfac aces es para para manipular objetos em um contexto persistente; d ) implementar recursos para o mapeamento O-R que permitam definir como os objetos tos em memória serão armazen zenados e recuperados de registros em tabelas do banco de dados; e ) utilizar classes que permitem manipular os objetos no contexto persistente. •
•
•
3
PERSISTÊNCII A COM PERSISTÊNC COM JA VA
Mapeamento Objeto Relacional Relacional (ORM (ORM))
Classe lassess Persistente Persistentess – JavaBe JavaBeans ans public public class class Ator Ator implem implement ents s ja java. va.io. io.Ser Serial ializ izabl able e {
private Intege Integer r id; String nome; nome; private String
public public Ator Ator() (){ } public public Integer Integer getId () { return return id; public public void void setId(Integer id) { this th is.i .id d = id id; ; } public public String String getNome() { return return nome; nome; } public public void void setNome(String no nome me) ) { this.n this.nome ome = nome; nome; } }
4
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Classes persistentes – modelo de negócio
5
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Framework Hibernate O Hibernate é um fram ew o rk para o M apeam ento Objeto Relacional (ORM) escrito na linguagem Java, mas também é disponível em .Net como o nome NHibernate. O termo mapeamento objeto-relacional (ORM) é a técnica de mapear dados originalmente armazenados de forma relacional em um modelo de objetos. O principal objetivo do Hibernate é diminuir a complexidade entre os programas Java, baseado no modelo orientado a objeto, que precisam trabalhar com um banco de dados do modelo relacional (presente na maioria dos SGDBs). Sua principal característica é a transformação das classes em Java para tabelas de dados e dos tipos de dados Java para os da linguagem SQL. 6
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Framework Hibernate ♦ Permite uma persistência transparente para o desenvolvimento das aplicações; ♦ facilita o mapeamento dos atributos entre uma base de dados relacionais e o modelo de objetos de uma aplicação; arquivos XML ou Anotações na próprias classes para ♦ Usa estabelecer esta relação. s na erce ra vers o ma uro ; ♦ ♦ É um software livre de código aberto distribuído com a licença LGPL.
7
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Framework Hibernate Instalando o Hibernate Core
•
Arquivos antlr.jar cglib.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar hibernate3.jar javassist.jar jta.jar dom4j.jar log4j.jar hibernate-annotations.jar ejb3-persistence.jar hibernate-commons-annotations.jar hibernate-entitymanager.jar
8
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
JPA - Java Persistence API - Consiste de um conjunto de interfaces e anotações que visam
padronizar o acesso aos framew orks de mapeamento O/ R e se baseia nas melhores idéias de tecnologias de persistência como Hibernate, TopLink, e JDO. - Solução completa para mapeamento e persistência de objetos:
modo declarativo de descrever mapeamento O/R, linguagem de consulta, ferramentas para manipular entidades - A JPA foi introduzida com a plataforma J ava EE 5.
- Desenvolvida como par te da J SR -2 20 - Tecn ologi a EJ B 3 .0, a JPA se
integra homogênea e consistentemente com o resto das simplificações nas APIs EJB 3.0 - Provê à comunidade Java uma única AP I padrão de persistência,
com a liberdade de escolha do provedor (implementação)
- Rapidamente os frameworks se adaptaram para funcionar como
p ro ve do re s J P A, incluindo recursos que permitam utilizar o padrão JPA para a construção de camadas de persistência 9
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Java Persistence AP I
10
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Conceitos Básicos • Entidades (Entity): Entidades são instâncias que podem ser armazenadas e recuperadas usando a API JPA. Precisa ser marcada com @Entity. Devem possuir um atributo identificador @Id que irá representar a chave primária no BD. • Contexto de Persistência: associação das instâncias em memória e o contexto persistente em BD. Estado dos objetos. • Gerenciador de Entidade (EntityManager): responsável pela execução das operações de persistência • P rovedor de P ersistência: implementa as interfaces definidas pela JPA (ex: Oracle TopLink Essentials, Hibernate Entity Manager, BEA Kodo, Apache OpenJPA) • Unidade de P ersistência: Configuração do provedor JPA para localizar o banco de dados e estabelecer conexões JDBC. • Mapeamento: Uso de classes e interfaces de mapeamento com o uso de anotações (@). 11
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Passos para criar uma aplicação Java com BD Criar um Banco de Dados para o projeto; Criar um novo projeto Java; Criar uma Unidade de Persistência para o projeto; Criar as classes de entidade – JavaBeans; – Adicionar mapeamentos de persistência nas classes (@Entity, @Id, @Column, @OneToMany, ...); Adicionar classes mapeadas na unidade de persistência Adicionar Bibliotecas do Hibernate-JPA no projeto; Adicionar driver JDBC no projeto; Para usar a Persistência: – Usar Persistence.EntityManagerFactory para criar uma instância de EntityManager usando a Unidade de Persistência; – Usar métodos de persistência da EntityManager (persist, merge, remove, createQuery, ...).
•
•
•
•
•
•
•
•
12
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Arquivo de Configuração – Unidade de Persistência - Visual
13
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Arquivo de Configuração – Unidade de Persistência - XML Quando usar Firebird, adicionar manualmente a linha para o dialeto.
14
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Criando um a EntityManager Para criar uma fábrica de EntityManager: EntityManagerFactory emf = Persistence.createEntityManagerFactory( "NomeUnidadePersistencia“);
Onde “NomeUnidadePersistencia” é o nome dado quando a unidade de persistência é criada.
Para criar uma EntityManager: EntityManager em = emf.createEntityManager();
Com o objeto em criado, pode-se então chamar os métodos de persistência de objetos, conforme exemplos a seguir. 15
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Usando EntityManager para persistir um objeto //Um objeto na memória: Ator a = new Ator(1, "Julia Roberts"); // Armazenando o objeto no BD em.getTransaction().begin(); em.persist(a); em.getTransaction().commit();
ATENÇÃO: modificações no BD só ocorrem se uma transação foi iniciada (em.getTransaction().begin();) antes de chamar o método de persistência (em.persist(a);) e no final for executado commit na transação ( em.getTransaction().commit();). A transação é necessária para uso com qualquer método de persistência que for modificar os dados do objeto no BD. 16
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Usando EntityManager para carregar um objeto // Carregar do BD um objeto pelo seu id Ator a = em.find(Ator.class, 2); // acessando os dados do objeto carregado System.out.println( "Código: "+a.getId()+ "
Nome: "+a.getNome());
17
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Usando EntityManager para alterar um objeto em.getTransaction().begin(); // carregar um objeto do BD Ator a = em.find(Ator.class, 2); // modificar o objeto a.setNome("Ator Modificado"); em.getTransaction().commit();
OBS: após o commit os dados do objeto são atualizados no BD!
•
18
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Usando EntityManager para remover um objeto em.getTransaction().begin(); // carregar um objeto do BD Ator a = em.find(Ator.class, 2); // remover o objeto do BD em.remove(a); em.getTransaction().commit();
OBS: após o commit, o objeto é removido do BD
•
19
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Usando EntityManager para listar ob jetos // Recupera todos os objetos Ator do BD Collection
lista = em.createQuery("from Ator”).getResultList(); // percorre dados
a
lista
de
atores
e
lista
seus
for(Ator at: lista) System.out.println( " Código: "+at.getId()+ " Nome: "+at.getNome());
20
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM)) Mapeamentos Usando Anotações
Na JPA, os objetos persistentes são denominados entidades (Entities). As classes e interfaces das anotações de mapeamento da JPA estão localizadas no pacote javax.persistence. Uma entidade é rotulada com a anotação @Entity. Uma tabela é representada pela anotação @Table e a chave primária pela anotação @Id. Cada coluna é especificada pela anotação @Column. Associações são mapeadas por anotações específicas, tais como: @ManyToOne, @OneToMany, @OneToOne, @ManyToMany, @Inheritance, … 21
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@Entity Anotação associada a classes Java. Determina que a classe é persistente. Obrigatório
Uma classe de entidade deve seguir a convenção JavaBean para que seus atributos sejam persistentes.
22
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@Id Toda classe precisa ter um identificador, que será associado a chave primária da tabela no banco de dados. Atritutos anotados com @Id serão identificadores, tanto para as instâncias de objetos da classe que está sendo mapeada como para os registros da respectiva tabela no banco de dados. Opcional
23
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM)) @Se q u e n c e Ge n e r a t o r e @Ge n e r a t e d V a l u e - SEQ U EN CE @ S e q u e n c e G e n e r a t o r mapeia uma seqüência do BD. @ G e n e r a t e d V a l u e permite gerar o código usando a seqüência
mapeada.
Opcional
24
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM)) @Se q u e n c e Ge n e r a t o r e @Ge n e r a t e d V a l u e – M a x ( )
Gerar o Id com uso da função de agregação max().
OBS: GenericGenerator é uma anotação específica do Hibernate
25
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@Column Por padrão, a JPA assume que o nome de cada atributo corresponde ao mesmo nome na tabela. Para modificar o mapeamento para uma coluna com o nome diferente do atributo, deve-se utilizar o atributo name, como a seguir: O cional
Opcional
26
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@Column Outros atributos para a anotação adicionados, como os seguintes: – – – –
@Column
podem
ser
name (String: nome do campo na tabela) nullable (boolean) length (int) unique (boolean)
27
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@Column Os tipos para os atributos são definidos conforme o tipo estabelecido para cada atributo na classe.
Também pode se utilizada a anotação @Lob
28
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM)) @Tem p or al
Para informações TIMESTAMP)
relacionadas
ao
tempo
(DATE,
TIME
29
e
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Mapeamento de Associações
As quatro anotações apresentadas a seguir podem ser usadas para mapear associações: – @OneToOne – @OneToMany – @ManyToOne – any o any
Em muitos casos, colocar a anotação no atributo da associação é o suficiente. Em alguns casos, é necessário definir alguns parâmetros para as anotações.
30
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@ManyToOne Para relacionamento “muitos para um” em BD relacional
31
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@ManyToOne - @JoinColumn(Opcional) A anotação @JoinColumn permite definir o nome da coluna que será utilizada na tabela do BD para estabelecer a associação. Opcional
Para a associação ser obrigatória Opcional
32
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM)) @OneToMany
Para relacionamentos “um para muitos” em BD relacional. Pode-se fazer um mapeamento bidirecional, como o exemplo abaixo.
Opcional 33
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@OneToOne Caso 1: Usando a chave primária compartilhada
Opcional
Opcional
34
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@OneToOne Caso 2: Usando a chave primária diferente
Opcional
Opcional
35
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@ManyToMany
A anotação @ManyToMany é usada em conjunto com a anotação @J oinTable é opcio nal e permite definir uma tabela associativa no BD. – Tabelas associativas são utilizadas em SGBDs relacionais para implementar uma associação . – Propriedades • joinColumns: Colunas que identificam a chave da entidade / owning entity • inverseJoinColumns: Colunas que identificam a chave da entidade de destino / target entity
36
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@ManyToMany
Opcional
37
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Mapeamento de Herança
Estratégias de mapeamento de herança: – Uma tabela para toda a hierarquia • Todas as classes = uma tabela – Uma tabela por classe concreta • uma c asse concre a = uma a e a – Uma tabela para cada classe da hierarquia • Uma classe = uma tabela
38
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Mapeamento de Herança – Tabela por Classe
Opcional
39
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
Chave Comp osta
40
PERSISTÊNCI A COM JA VA
Mapeamento Objeto Relacional (ORM (ORM))
@NamedQuery Cria consulta prédefinida (estática) associado com a @Entity
41