Você está na página 1de 54

Hibernate

Mapeamento O/R Marcio Aguiar Ribeiro aguiar.marcio@gmail.com

Hibernate O que ?
Ferramenta para mapeamento O/R em Java
Uma das mais difundidas

Transparncia Independncia quanto ao tipo de base de dados Consulta de dados


HQL, Criteria Queries, SQL, JPA QL

Extensvel Licena LGPL

LES/PUC-Rio

Hibernate vs. JDBC

HIBERNATE

JDBC

LES/PUC-Rio

Hibernate - Arquitetura

Arquitetura - Overview

LES/PUC-Rio

Hibernate Objetos Persistentes

Objetos Persistentes
Implementam entidades lgica do negcio POJOs (Plain Old Java Object)
Construtor padro Possui mtodos de acesso gets/sets (opcional)

Possui um atributo identificador (recomendado) Classes no final (recomendado) Recomenda-se implementar Serializable

LES/PUC-Rio

POJO - Exemplo

LES/PUC-Rio

POJO - Exemplo

mapeamento
LES/PUC-Rio

Mapeamento
Devemos informar ao Hibernate como relacionar o modelo de objetos com o modelo relacional Arquivos de mapeamento vs. Annotations

LES/PUC-Rio

Mapeando as classes
Declarao de entidade
Anotao @Entity Indicao do nome da table atravs do @Table (opcional)

@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable { ... }

LES/PUC-Rio

Mapeamento de Identificadores
Indicao da chave primria
@Id

Escolha do gerador da Chave


@GeneratedValue Estratgias: AUTO, SEQUENCE, IDENTITY e TABLE

@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable {

@Id @GeneratedValue private Long id; ... }

ver classe
LES/PUC-Rio

Mapeamento de Propriedades
Mapeamento de atributos primitivos no so necessrios Opcionalmente todo atributo pode ser anotado com @Column
name lenght nullable unique ...
@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable { ... @Column(name="comNome", length=30, nullable=false, unique=true) private String nome; ... }

ver classe
LES/PUC-Rio

Mapeamento de Propriedades
Para datas (Date ou Calendar) necessrio a anotao @Temporal para definir preciso:
DATE TIME TIMESTAMP

@Entity public class Ator implements Serializable { ... @Temporal(TemporalType.DATE) private Calendar nascimento; ... }

ver classe
LES/PUC-Rio

Mapeamento de Relacionamentos
one-to-one many-to-one one-to-many many-to-many

LES/PUC-Rio

Mapeamento de Relacionamentos - Exemplo

Unidirecional one-to-many

Bidirecional many-to-many

Unidirecional many-to-one

Unidirecional one-to-one

LES/PUC-Rio

Mapeamento one-to-one
Trs formas
Relao com chave estrangeira (Cdigo 1) Relao por chave primria (Cdigo 2) Com tabela associativa (Cdigo 3)
public class Ator implements Serializable { ... @OneToOne @JoinColumn(name=cadastro_id, unique=true) private Cadastro cadastro; ... } ... } public class Ator implements Serializable { ... @OneToOne @PrimaryKeyJoinColumn private Cadastro cadastro;

Cdigo 2

Cdigo 1

public class Ator implements Serializable { ... @OneToOne @JoinTable( name=Ator_Cadastro", joinColumns = @JoinColumn(name = Ator_ID"), inverseJoinColumns = @JoinColumn(name = Cadastro_ID") ) private Cadastro cadastro; ... }

Cdigo 3
LES/PUC-Rio

Modelo relacional
atores id <<PK>> 1) cadastro_id <<FK>> nome nascimento cadastros id <<PK>> email username senha

atores id <<PK>> <<FK>> 2) nome nascimento

cadastros id <<PK>> email username senha

LES/PUC-Rio

Mapeamento many-to-one

@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable { ... @ManyToOne private Ator criador; ... }

LES/PUC-Rio

Modelo relacional

comunidades id <<PK>> nome descricao atorID <<FK>>

atores id <<PK>> nome nascimento

LES/PUC-Rio

Mapeamento uso de Colees


java.util.Set, java.util.Collection, java.util.List, java.util.Map, java.util.SortedSet, java.util.SortedMap...

@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable { ... @OneToMany private Set<Papel> papeis; ... }

LES/PUC-Rio

Modelo relacional

comunidades id <<PK>> nome descricao atorID <<FK>>

papeis id <<PK>> nome descricao comunidadeID <<FK>>

LES/PUC-Rio

Mapeamento many-to-many

@Entity() public class Ator implements Serializable { ... @ManyToMany() @JoinTable( name = "ATOR_PAPEL", joinColumns = {@JoinColumn(name = "ATOR_ID")}, inverseJoinColumns = {@JoinColumn(name = "PAPEL_ID")} ) private Set<Papel> papeis; ... }

LES/PUC-Rio

Mapeamento List many-to-many

@Entity() public class Papel implements Serializable { ... @ManyToMany(mappedBy="papeis) @IndexColumn(name="indice") private List<Ator> atores; ... }

LES/PUC-Rio

Modelo relacional

atores
id <<PK>> nome nascimento

ator_papel
atorID <<FK>> papelID <<FK>> indice nome

papeis
id <<PK>> descricao comunidadeID <<FK>>

LES/PUC-Rio

Mapeamento - Herana
Trs estratgias
Tabela por hierarquia Tabela por subclasse Tabela por classe concreta

Recurso
Polimorfismo implcito

LES/PUC-Rio

Tabela por hierarquia


Precisa determinar um discriminador
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name=TIPO_DE_ATOR, discriminatorType=DiscriminatorType.STRING) public abstract class Ator implements Serializable { }

@Entity @DiscriminatorValue(value=T) public class Trabalhador extends Ator { } @Entity @DiscriminatorValue(value=E) public class Estudante extends Ator { }

LES/PUC-Rio

Modelo relacional

Ator id <<PK>> nome nascimento escola ano ocupacao salario TIPO_DE_ATOR

LES/PUC-Rio

Tabela por classe concreta


@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class Ator implements Serializable { }

@Entity public class Estudante extends Ator { }

@Entity public class Trabalhador extends Ator { }

LES/PUC-Rio

Modelo relacional

Estudante id <<PK>> nome nascimento escola ano

Trabalhador id <<PK>> nome nascimento ocupacao salario

LES/PUC-Rio

Tabela por classe


@Entity @Inheritance(strategy=InheritanceType.JOINED) public class Ator implements Serializable { }

@Entity public class Estudante extends Ator { }

@Entity public class Trabalhador extends Ator { }

LES/PUC-Rio

Modelo relacional

Estudante id <<PK>> <<FK>> escola ano

Ator id <<PK>> nome nascimento

Trabalhador id <<PK>> <<FK>> ocupacao salario

LES/PUC-Rio

Configurao
META-INF/persistence.xml
Driver, url do banco de dados, senha, etc.

LES/PUC-Rio

Copiar bibliotecas
Copiar as bibliotecas necessrias para o funcionamento do Hibernate

LES/PUC-Rio

Criando o banco
Adiciona-se o atributo hibernate.hbm2ddl.auto ao persistence.xml Pode ser feito programticamente necessrio a existncia de um banco com o nome especificado na configurao

Map configOverrides = new HashMap(); configOverrides.put("hibernate.hbm2ddl.auto", "create-drop"); EntityManagerFactory programmaticEmf = Persistence.createEntityManagerFactory("HibernateTest", configOverrides);

LES/PUC-Rio

Trabalhando com classes persistentes

EntityManagerFactory
persistence.xml

cria

EntityManager P1 C1 P2 A1

save BANCO delete

LES/PUC-Rio

EntityManagerFactory (javax.persistence.EntityManagerFactory) Threadsafe Carrega as informaes definidas no arquivo persistence.xml Fbrica de EntityManager Geralmente se usa uma por aplicao
Exceto quando se precisa acessar mais de uma fonte de dados

LES/PUC-Rio

EntityManager (javax.persistence.EntityManager)

Representa a troca de informaes entre a aplicao e um esquema de armazenamento de dados Comea e finaliza transaes Wrapper para conexes JDBC Cache de objetos persistentes

LES/PUC-Rio

Criando uma Session


Criando um EntityManagerFactory

EntityManagerFactory factory = Persistence. createEntityManagerFactory("HibernateTest");

Criando um EntityManager

EntityManager manager = factory.createEntityManager();

LES/PUC-Rio

Demarcao de transao
Fronteiras de transao so obrigatrias Envolve 4 passos bsicos
iniciar transao dar o commit na transao tratar erros fechar sesso
}

try { manager.getTransaction().begin(); [operaes com o banco] manager.getTransaction().commit(); } catch (RuntimeException ex) { manager.getTransaction().rollback(); throw ex; } finally { manager.close();

LES/PUC-Rio

Ciclo de vida dos objetos persistentes


Transientes Persistentes Detached

LES/PUC-Rio

Tornando um objeto persistente


Novas instancia so consideradas transientes Usa-se o comando persist para tornar um objeto persistente Ao salvar o seu id gerado Se o objeto tiver associao com outros objetos preciso salva-los antes (ou usar persistncia transitiva)

Comunidade comunidade = new Comunidade( "Comunidade 1", "Primeira comunidade"); manager.persist(comunidade);

LES/PUC-Rio

Carregando um objeto
Comando find
Carrega pelo id do objeto

Comunidade comunidade = manager.find(Comunidade.class, new Long(1));

LES/PUC-Rio

Consultando objetos
JPA QL
Linguagem de consulta semi-OO

Criteria
Uma API orientada a objeto para busca

SQL

LES/PUC-Rio

JPA QL
List<Comunidade> comunidades = manager. createQuery("from Comunidade").getResultList(); List<Comunidade> comunidades = manager. createQuery("from Comunidade c where c.nome = ?") .setParameter(1, Java) .getResultList(); List<Comunidade> comunidades = manager. createQuery("from Comunidade c where c.nome = :nome") .setParameter(nome, Java) .getResultList(); List<Comunidade> comunidades = manager. createQuery("from Comunidade c where c.nome = ? and c.descricao like ?") .setParameter(1, Java) .setParameter(2, %Programadores%) .getResultList();

Outer e inner join, subquery, order by, group by e vrios operadores


LES/PUC-Rio

Paginao
Usado para determinar fronteiras no resultado til para evitar desperdcio de memria.

List<Comunidade> comunidades = manager. createQuery("from Comunidade") .setFirstResult(5) .setMaxResult(5) .getResultList();

LES/PUC-Rio

Externalizando queries
Queries declaradas nas classe via Annotation No mistura cdigo de consulta com o da aplicao
@Entity @Table (name = "COMUNIDADES") @NamedQueries({ @NamedQuery(name=Comunidade.porCriador), query=from Comunidade c where c.criador = ? }) public class Comunidade implements Serializable { ... } Ator ator = manager.find(Ator.class, new Long(1)); List<Comunidade> comunidades = manager. createNamedQuery("Comunidade.porCriador"). setParameter(1, ator).getResultList();
LES/PUC-Rio

Criteria API
Mais prximo de desenvolvedores que no conhecem linguagens de consulta No disponvel na JPA

LES/PUC-Rio

Alterando objetos persistentes

Ator ator = manager.find(Ator.class, new Long(1)); ator.setName("Marcio"); manager.getTransaction().commit();

Para instncias fora do contexto de persistncia

manager.getTransaction().begin(); ator.setName("Marcio"); manager.merge(ator); manager.getTransaction().commit();

LES/PUC-Rio

Tornando os objetos transientes


Remove o objeto do banco Cuidado para no resultar em violao de integridade
Exemplo: ao remover um ator, seu cadastro deve ser removido tambm

Ator ator = manager.find(Ator.class, new Long(1)); manager.remove(ator.getCadastro()); manager.remove(ator); manager.getTransaction().commit();

LES/PUC-Rio

Persistncia transitiva
As operaes (persist, remove, merge) realizadas com o banco podem resultar em violaes de integridade O Hibernate possui mecanismos para tratar relaes do tipo pai/filho automaticamente
Ex.: Ao remover um ator do banco no faz sentido manter o cadastro do ator

public class Ator implements Serializable { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cadastro_id, unique=true) private Cadastro cadastro; ... }

public class Comunidade implements Serializable { ... @ManyToOne(cascade=CascadeType.PERSIST) @JoinColumn(name =Ator_ID, nullable=false) private Ator criador; ... }

LES/PUC-Rio

Carga preguiosa
Carga dos objetos feita apenas quando necessrio Evita sobrecarregar a memria com objetos no necessrios Hibernate usa proxies das colees Java Pode ser difcil de se trabalhar (LazyInitializationException)
public class Comunidade implements Serializable { ... @ManyToOne(cascade=CascadeType.PERSIST, fetch=FetchType.LAZY) @JoinColumn(name =Ator_ID, nullable=false) private Ator criador; ... }

LES/PUC-Rio

Boas prticas e padres


Uso de Data Access Objects (DAOs e Generic DAOs) Patterns
Session-per-request
Uma sesso aberta no inicio de uma requisio web e fechada ao final Implementada com ServletFilter

Anti-patters
Session-per-operation
Uma sesso aberta para cada operao executada

Otimizar o pool de conexes (c3p0) Configurar o cache

LES/PUC-Rio

Exerccios
Trabalhar a auto-didtica
Referncia do Hibernate bastante completa:
http://www.hibernate.org

Livro: JPA with Hibernate por Gavin King

LES/PUC-Rio

Você também pode gostar