Escolar Documentos
Profissional Documentos
Cultura Documentos
Hibernate
Hibernate
Hibernate O que ?
Ferramenta para mapeamento O/R em Java
Uma das mais difundidas
LES/PUC-Rio
HIBERNATE
JDBC
LES/PUC-Rio
Hibernate - Arquitetura
Arquitetura - Overview
LES/PUC-Rio
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
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
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
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
LES/PUC-Rio
@Entity @Table (name = "COMUNIDADES") public class Comunidade implements Serializable { ... @OneToMany private Set<Papel> papeis; ... }
LES/PUC-Rio
Modelo relacional
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
@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
@Entity @DiscriminatorValue(value=T) public class Trabalhador extends Ator { } @Entity @DiscriminatorValue(value=E) public class Estudante extends Ator { }
LES/PUC-Rio
Modelo relacional
LES/PUC-Rio
LES/PUC-Rio
Modelo relacional
LES/PUC-Rio
LES/PUC-Rio
Modelo relacional
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
EntityManagerFactory
persistence.xml
cria
EntityManager P1 C1 P2 A1
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 um EntityManager
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
LES/PUC-Rio
LES/PUC-Rio
Carregando um objeto
Comando find
Carrega pelo id do objeto
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();
Paginao
Usado para determinar fronteiras no resultado til para evitar desperdcio de memria.
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
LES/PUC-Rio
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
Anti-patters
Session-per-operation
Uma sesso aberta para cada operao executada
LES/PUC-Rio
Exerccios
Trabalhar a auto-didtica
Referncia do Hibernate bastante completa:
http://www.hibernate.org
LES/PUC-Rio