hibernate jpa or

42
PERSISTENCIA COM JAVA PERSISTENCIA COM JAVA JPA JPA – Java Java Persistence Persistence API API Mapeamento Mapeamento OR com OR com Anotações Anotações Mapeamento Mapeamento OR com OR com Anotações Anotações Hibernate Hibernate como como Provedor Provedor de de Persistência Persistência Prof. Prof. Jaqson Jaqson Dalbosco Dalbosco [email protected] [email protected]

Upload: nelson-filho

Post on 06-Mar-2015

174 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Hibernate JPA or

PERSISTENCIA COM JAVAPERSISTENCIA COM JAVA

JPA JPA –– Java Java PersistencePersistence APIAPIMapeamentoMapeamento OR com OR com AnotaçõesAnotaçõesMapeamentoMapeamento OR com OR com AnotaçõesAnotações

Hibernate Hibernate comocomo ProvedorProvedor de de PersistênciaPersistência

Prof. Prof. JaqsonJaqson [email protected]@upf.br

Page 2: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Mapeamento Objeto-Relacional•Linguagens de Programação orientadas a objetos e SGBDsrelacionais = complexidade de implementação

22

Page 3: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

RequisitosPara trabalhar com o desenvolvimento de sistemas OO comSGBDs relacionais em Java, é preciso:a) implementar as classes persistentes do sistema seguindo umDesign Pattern (padrão de projeto) adotado pelos frameworks depersistência;b) dispor de frameworks que realizem todo o trabalho pesado daconversão O-R;conversão O-R;•c) dispor de APIs que disponibilizem classes e interfaces paramanipular objetos em um contexto persistente;•d) implementar recursos para o mapeamento O-R que permitamdefinir como os objetos em memória serão armazenados erecuperados de registros em tabelas do banco de dados;•e) utilizar classes que permitem manipular os objetos no contextopersistente.

33

Page 4: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Classes Persistentes – JavaBeanspublic class Ator implements java.io.Serializable {

private Integer id;private String nome;public Ator(){}public Integer getId() {

return id;}}public void setId(Integer id) {

this.id = id;}public String getNome() {

return nome;}public void setNome(String nome) {

this.nome = nome;}

}44

Page 5: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Classes persistentes – modelo de negócio

55

Page 6: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Framework HibernateO Hibernate é um framework para o Mapeamento 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 demapear dados originalmente armazenados de forma relacional emum modelo de objetos.

O principal objetivo do Hibernate é diminuir a complexidadeentre os programas Java, baseado no modelo orientado aobjeto, que precisam trabalhar com um banco de dados domodelo relacional (presente na maioria dos SGDBs).

Sua principal característica é a transformação das classes emJava para tabelas de dados e dos tipos de dados Java paraos da linguagem SQL.

66

Page 7: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Framework Hibernate♦ Permite uma persistência transparente para o desenvolvimentodas aplicações;♦ facilita o mapeamento dos atributos entre uma base de dadosrelacionais e o modelo de objetos de uma aplicação;♦ Usa arquivos XML ou Anotações na próprias classes paraestabelecer esta relação.♦ Está na terceira versão (maduro);♦ Está na terceira versão (maduro);♦ É um software livre de código aberto distribuído com a licençaLGPL.

77

Page 8: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Framework Hibernate•Instalando o Hibernate Core Arquivos

antlr.jarcglib.jarasm.jarasm-attrs.jarscommons-collections.jarcommons-logging.jarhibernate3.jarjavassist.jar

88

jta.jardom4j.jarlog4j.jar

hibernate-annotations.jarejb3-persistence.jarhibernate-commons-annotations.jar

hibernate-entitymanager.jar

Page 9: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

JPA - Java Persistence API- Consiste de um conjunto de interfaces e anotações que visampadronizar o acesso aos frameworks de mapeamento O/R e sebaseia 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 Java EE 5.

- Desenvolvida como parte da JSR-220 - Tecnologia EJB 3.0, a JPA seintegra homogênea e consistentemente com o resto das simplificaçõesnas APIs EJB 3.0

- Provê à comunidade Java uma única API padrão de persistência,com a liberdade de escolha do provedor (implementação)

- Rapidamente os frameworks se adaptaram para funcionar comoprovedores JPA, incluindo recursos que permitam utilizar o padrão JPApara a construção de camadas de persistência

99

Page 10: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Java Persistence API

1010

Page 11: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Conceitos Básicos• Entidades (Entity): Entidades são instâncias que podem serarmazenadas e recuperadas usando a API JPA. Precisa sermarcada 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 emmemória e o contexto persistente em BD. Estado dos objetos.

• Gerenciador de Entidade (EntityManager): responsável pelaexecução das operações de persistência

• Provedor de Persistência: implementa as interfaces definidaspela JPA (ex: Oracle TopLink Essentials, Hibernate Entity Manager,BEA Kodo, Apache OpenJPA)

• Unidade de Persistência: Configuração do provedor JPA paralocalizar o banco de dados e estabelecer conexões JDBC.

• Mapeamento: Uso de classes e interfaces de mapeamento como uso de anotações (@).

1111

Page 12: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (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 umainstância de EntityManager usando a Unidade dePersistência;

– Usar métodos de persistência da EntityManager (persist,merge, remove, createQuery, ...).

1212

Page 13: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Arquivo de Configuração – Unidade de Persistência - Visual

1313

Page 14: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Quando usar Firebird, adicionar manualmente a linha para odialeto.

Arquivo de Configuração – Unidade de Persistência - XML

1414

Page 15: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Criando uma EntityManagerPara criar uma fábrica de EntityManager:

EntityManagerFactory emf =Persistence.createEntityManagerFactory("NomeUnidadePersistencia“);

Onde “NomeUnidadePersistencia” é o nome dado quando aunidade 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 depersistência de objetos, conforme exemplos a seguir.

1515

Page 16: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Usando EntityManager para persistir um objeto//Um objeto na memória:Ator a = new Ator(1, "Julia Roberts");// Armazenando o objeto no BDem.getTransaction().begin();em.persist(a);em.getTransaction().commit();

ATENÇÃO: modificações no BD só ocorrem se uma transação foiiniciada (em.getTransaction().begin();) antes de chamar ométodo de persistência (em.persist(a);) e no final for executadocommit na transação (em.getTransaction().commit();).

A transação é necessária para uso com qualquer método depersistência que for modificar os dados do objeto no BD.

1616

Page 17: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Usando EntityManager para carregar um objeto

// Carregar do BD um objeto pelo seu idAtor a = em.find(Ator.class, 2);// acessando os dados do objeto carregadoSystem.out.println(

"Código: "+a.getId()+" Nome: "+a.getNome());

1717

Page 18: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Usando EntityManager para alterar um objeto

em.getTransaction().begin();// carregar um objeto do BDAtor a = em.find(Ator.class, 2);// modificar o objetoa.setNome("Ator Modificado");em.getTransaction().commit();

•OBS: após o commit os dados do objeto são atualizados no BD!

1818

Page 19: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Usando EntityManager para remover um objeto

em.getTransaction().begin();// carregar um objeto do BDAtor a = em.find(Ator.class, 2);// remover o objeto do BDem.remove(a);em.getTransaction().commit();

•OBS: após o commit, o objeto é removido do BD

1919

Page 20: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Usando EntityManager para listar objetos

// Recupera todos os objetos Ator do BDCollection<Ator> lista =

em.createQuery("from Ator”).getResultList();// percorre a lista de atores e lista seusdadosfor(Ator at: lista)

System.out.println(" Código: "+at.getId()+" Nome: "+at.getNome());

2020

Page 21: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (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 JPAestão localizadas no pacote javax.persistence.

Uma entidade é rotulada com a anotação @Entity. Uma tabela é

2121

Uma entidade é rotulada com a anotação @Entity. Uma tabela érepresentada pela anotação @Table e a chave primária pelaanotaçã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, …

Page 22: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@EntityAnotação associada a classes Java. Determina que a classe épersistente.

Obrigatório

Obrigatório

Uma classe de entidade deve seguir a convenção JavaBean paraque seus atributos sejam persistentes.

2222

Obrigatório

Page 23: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@IdToda classe precisa ter um identificador, que será associado achave primária da tabela no banco de dados.

Atritutos anotados com @Id serão identificadores, tanto para asinstâncias de objetos da classe que está sendo mapeada comopara os registros da respectiva tabela no banco de dados.

2323

Opcional

Page 24: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@SequenceGenerator e @GeneratedValue - SEQUENCE

@SequenceGenerator mapeia uma seqüência do BD.@GeneratedValue permite gerar o código usando a seqüênciamapeada.

2424

Opcional

Page 25: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@SequenceGenerator e @GeneratedValue – Max()Gerar o Id com uso da função de agregação max().

2525

OBS: GenericGenerator é uma anotação específica do Hibernate

Page 26: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ColumnPor padrão, a JPA assume que o nome de cada atributocorresponde ao mesmo nome na tabela. Para modificar omapeamento para uma coluna com o nome diferente do atributo,deve-se utilizar o atributo name, como a seguir:

Opcional

2626

Opcional

Opcional

Page 27: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ColumnOutros atributos para a anotação @Column podem seradicionados, como os seguintes:

– name (String: nome do campo na tabela)– nullable (boolean)– length (int)– unique (boolean)

2727

Page 28: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ColumnOs tipos para os atributos são definidos conforme o tipoestabelecido para cada atributo na classe.

2828

Também pode se utilizadaa anotação @Lob

Page 29: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@TemporalPara informações relacionadas ao tempo (DATE, TIME eTIMESTAMP)

2929

Page 30: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Mapeamento de Associações

As quatro anotações apresentadas a seguirpodem ser usadas para mapear associações:

– @OneToOne– @OneToMany– @ManyToOne– @ManyToMany– @ManyToMany

Em muitos casos, colocar a anotação noatributo da associação é o suficiente.Em alguns casos, é necessário definir algunsparâmetros para as anotações.

3030

Page 31: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ManyToOnePara relacionamento “muitos para um” em BD relacional

3131

Page 32: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

A anotação @JoinColumn permite definir o nome da coluna queserá utilizada na tabela do BD para estabelecer a associação.

@ManyToOne - @JoinColumn(Opcional)

Opcional

Para a associação ser obrigatória

3232

Opcional

Page 33: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@OneToManyPara relacionamentos “um para muitos” em BD relacional. Pode-sefazer um mapeamento bidirecional, como o exemplo abaixo.

3333

Opcional

Page 34: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@OneToOneCaso 1: Usando a chave primária compartilhada

3434

Opcional

Opcional

Page 35: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Caso 2: Usando a chave primária diferente@OneToOne

3535

Opcional

Opcional

Page 36: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ManyToMany

A anotação @ManyToMany é usada em conjunto coma anotação @JoinTable é opcional e permite definiruma tabela associativa no BD.

– Tabelas associativas são utilizadas em SGBDsrelacionais para implementar uma associaçãomuitos para muitos.muitos para muitos.

– Propriedades• joinColumns: Colunas que identificam a chave

da entidade / owning entity• inverseJoinColumns: Colunas que identificam

a chave da entidade de destino / target entity

3636

Page 37: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@ManyToMany

Opcional

3737

Page 38: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Mapeamento de HerançaEstratégias de mapeamento de herança:

– Uma tabela para toda a hierarquia• Todas as classes = uma tabela

– Uma tabela por classe concreta• uma classe concreta = uma tabela• uma classe concreta = uma tabela

– Uma tabela para cada classe da hierarquia• Uma classe = uma tabela

3838

Page 39: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Mapeamento de Herança – Tabela por Classe

3939

Opcional

Page 40: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Chave Composta

4040

Page 41: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

@NamedQueryCria consulta prédefinida (estática) associado com a @Entity

4141

Page 42: Hibernate JPA or

PERSISTÊNCIA COM JAVAMapeamento Objeto Relacional (ORM)Mapeamento Objeto Relacional (ORM)

Mais sobre Mapeamentos com Anotações

http://www.hibernate.org/hib_docs/annotations/reference/en/html/

4242