Download - Introdução ao Hibernate
Andrêsa CibellyAndrêsa CibellyClébia AlvesClébia Alves
Cleyton VanutCleyton VanutMouglas EugênioMouglas Eugênio
Ronnie SantosRonnie Santos
12/04/23
O.O. + B.D. , Quadro atualO.O. + B.D. , Quadro atualO.O. + B.D. , Quadro atualO.O. + B.D. , Quadro atual
Problema: Temos um aplicativo O.O. que precisa interagir com um banco de dados.
Os bancos de dados O.O. ainda têm grandes desvantagens em relação aos relacionais.
O padrão vigente nas empresas é o banco de, dados relacional e sem uma perspectivas de mudança.
O Mapeamento Objeto-Relacional (OR) é a solução para o problema.
Técnica de desenvolvimento que representa o objeto de maneira relacional na gravação do banco de dados, e consegue fazer o caminho inverso sem perder informação.
2
Hibernate - DefiniçãoHibernate - DefiniçãoHibernate - DefiniçãoHibernate - Definição
Ferramenta de Mapeamento Objeto Relacional para Java. Transforma os dados de um objeto em uma linha de uma tabela de um banco de dados, ou de forma inversa, com a transformação de uma linha da tabela em um objeto da aplicação.
TabelaObjeto
3
Hibernate - DefiniçãoHibernate - DefiniçãoHibernate - DefiniçãoHibernate - Definição 4
5
Fazer a transformação sem Hibernate
6
CaracterísticasCaracterísticasCaracterísticasCaracterísticas
Objetivo: diminuir a
complexidade entre os
programas Java, que
precisam trabalhar com um
banco de dados do modelo
relacional.
-Transformação das classes em Java para tabelas de dados
- Transformação dos tipos de dados Java para os da SQL.
O Hibernate gera as chamadas SQL e libera o desenvolvedor do trabalho de conversão manual dos dados
7
HQL (Hibernate Query Language)HQL (Hibernate Query Language)HQL (Hibernate Query Language)HQL (Hibernate Query Language)
o HQL é um dialeto SQL para o Hibernate;
o Linguagem de consulta que se parece muito com a SQL;
o Totalmente OO (Inclui herança, Polimorfismo e Encapsulamento);
o Pesquisas são feitas em OBJETOS e não em colunas
o Nela você não vai referenciar tabelas, vai referenciar os seus objetos do modelo que foram mapeados para as tabelas do banco de dados.
Ex.:
-> SQL: SELECT *from Turma
-> HQL seria simplesmente “from Turma”
8
VantagensVantagensVantagensVantagens DesvantagensDesvantagensDesvantagensDesvantagens
O desenvolvedor se livra de escrever muito do código de acesso ao BD;
Acelera a velocidade de desenvolvimento;
Os arquitetos podem se preocupar mais com as regras de negócios;
Melhor tratamento de exceções;
Sistemas que fazem uso extensivo de:
stored procedures triggers maior parte da lógica da aplicação
no banco de dados,
não vão se beneficiar com o uso do Hibernate
9
10
MapeamentoMapeamentoMapeamentoMapeamento
- Hibernate é um Framewok para mapeamento
Objeto/Relacional em Java
- Visa facilitar, para os desenvolvedores, a implementação da camada de persistência da aplicação
Possibilita desenvolver classes persistentes usando Java
convencional:
Associação Composição
Herança Polimorfismo
e coleções Java
Persistência usando Hibernate
11
Persistência e MapeamentoPersistência e MapeamentoPersistência e MapeamentoPersistência e Mapeamento
Arquivos XML são usados para estabelecer a relação, descrevendo os campos, associações e subclasses persistentes.
A solução do Mapeamento consiste em adicionar identificadores ñ naturais, como as marcações e atributos abaixo:
<class> <id><property><generator> column, name , <inverse>, <key>, <any>.
12
13
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC “
-//Hibernate/Hibernate Mapping DTD 2.0//EN“ "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping>
<class name="Cliente" table="CLIENTE">
<id column="CLIENTE_ID" name="id" type="java.lang.Long">
<generator class="sequence"/> </id>
<property column="NOME“
length="50“ name="nome" not-null="true“ type="java.lang.String" /> ...
<property
column="DATRA_NASCIMENTO"name="nascimento" type="java.util.Date"
/> </class> </hibernate-mapping>
Para mapear relações entre objetos persistentes usa-se os elementos
Mapeamento um-para-um com Cliente -> Usuário <one-to-one name="usuario“ class="Usuario"/>
Mapeamento e AssociaçõesMapeamento e AssociaçõesMapeamento e AssociaçõesMapeamento e Associações 14
15
Mapeamento muitos-para-um com Cliente -> Dependentes <many-to-one name="cliente" column="CLIENTE_ID" class="Cliente" not-null="true"/>
ArquiteturaArquiteturaArquiteturaArquitetura
Arquitetura Baseada em Camadas
Cada camada é composta por classes que se relacionam a fim de desempenhar uma tarefa específica e importante na aplicação.
Camada de Negócios (Business Layer)
Esta camada é responsável em implementar todo código
responsável pela lógica de negócio. Boa parte da
complexidade do sistema é implementada e resolvida por
esta camada.
Camada de Persistência(Persistence Layer)
A camada de persistência compreende o grupo de classes
responsáveis em persistir dados e informações, como
também, recuperá-los e gerenciá-los de forma eficiente.
16
17
API do HibernateAPI do HibernateAPI do HibernateAPI do Hibernate
Está organizada nos pacotes e subpacotes de org.hibernate;Servem para armazenar, remover, atualizar e recuperar objetos persistentes e lidar com transações;
1. Configuration (org.hibernate. Configuration)
Geralmente obtém a configuração via arquivos XML ou propriedades dinâmicas.É o ponto de partida para iniciar o Hibernate;
Define-se diversas configurações do Hibernate; por exemplo:
O dialeto do BD a ser utilizado, senha do banco, usuário, etc.
Cria a SessionFactory;
Instanciar um objeto de configuração (org.hibernate.cfg.Configuration) e inserir suas propriedades programaticamente; Usar um arquivo .properties com as suas configurações e indicar os arquivos de mapeamento programaticamente; Usar um arquivo XML (hibernate.cfg.xml) com as propriedades de inicialização e os caminhos dos arquivos de mapeamento.
18
Import org.apache.log4j.BasicConfigurator; import org.hibernate.cfg.Configuration;
public class BemVindoHibernate {public static void main(String[]
args) { // Configura Log4j sem exigir arquivoBasicConfigurator.configure();// Hibernate procura por
'hibernate.properties‘. Deve estar disponível no CLASSPATH
new Configuration();System.out.println("Bem-vindo ao curso
de Hibernate"); } }
19
SessionFactory(org.hibernate.SessionSessionFactory(org.hibernate.SessionFactory)Factory)
Permite a criação de objetos Session;É pesado; lento para inicializar e destruir;Deve-se haver apenas uma SessionFactory para cada BD utilizado;
Exemplo:
Session sessao = fabricaSessoes.openSession();
Transaction transacao = sessao.beginTransaction();
Pessoa pessoa = sessao.load(Pessoa.class, new Long(1));
sessao.delete(pessoa);transacao.commit(); sessao.close();
20
Transaction(org.hibernate.TrTransaction(org.hibernate.Transaction)ansaction)
É uma API opcional do Hibernate;Abstração da implementação de transações usada no código
A implementação real pode ser uma transação JTA, JDBC, etc.
Essencial para garantir a portabilidade de aplicação entre diferentes ambientes e containers;
Exemplo:
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import
org.hibernate.cfg.Configuration;public class InsereA {
public static void main(String[] args) {Configuration cfg = new
Configuration().configure();SessionFactory sf =
cfg.buildSessionFactory();Session s =
sf.openSession(); Transaction tr = s.beginTransaction();s.save(new A("a1"));
s.save(new A("a2"));tr.commit();s.close(); }
}
21
Criteria e QueryCriteria e Query
As consultas Query são feitas em SQL(Structured Query Language) ou HQL(Hibernate Query Language);Objetos Query são usados para:
- Passar parâmetros para a consulta em HQL;- Filtrar resultados;- Executar os comandos da consulta;
Uma Query só pode ser usada dentro de sua sessão;
Critério é uma alternativa que faz a mesma coisa usando métodos da API (em Java, em vez de HQL);
Exemplo:
String hql=“from Produto where preco>:preco”;Query
query=session.createQuery(hql);query.setDouble(“preco”,25,0);List results=query.list();
22
Em Java:Object.equals(Object ob);
O banco só entende tabelas
IdentidadeIdentidade 23
A solução é a chave//Listagem do arquivo Pessoa.javapublic class Pessoa {private String nome;private String email;private String telefone;private Endereco endereco;private Integer id;//métodos getters e setters das propriedades}
24
25
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mappingPUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="Pessoa"><!-- Identificador da classe --><id name="id"><generator class="increment"/></id><!-- Propriedades da classe --><property name="nome"/><property name="telefone"/><property name="email"/><!-- Relacionamento da classe --><one-to-onename="endereco"class="Endereco"cascade="save-update"/></class></hibernate-mapping>
Arquivo de MapeamentoArquivo de MapeamentoArquivo de MapeamentoArquivo de Mapeamento 26
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mappingPUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="Endereco"><id name="id"column="Pessoa_id"><generator class="foreign"><param name="property">pessoa</param></generator></id><property name="bairro"/><property name="cidade"/><property name="complemento"/><property name="estado"/><property name="numero"/><property name="rua"/><property name="cep"/><one-to-onename="pessoa"class="Pessoa"constrained="true"/></class></hibernate-mapping>
27
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mappingPUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN“"http://hibernate.sourceforge.net/hibernate-mapping-
3.0.dtd"><hibernate-mapping><joined-subclass name="Professor" extends="Pessoa"><key column="Pessoa_id"/><property name="titulo"/><set name="turmas"inverse="true"><key column="Pessoa_Professor_id"/><one-to-many class="Turma"/></set></joined-subclass></hibernate-mapping>
HerançaHerançaHerançaHerança 28
Professor professor = new Professor();Turma turma = new Turma();turma.setProfessor(professor);professor.getTurmas().add(turma);
Entendendo melhor o “inverse”Entendendo melhor o “inverse”
Configurando...Configurando...
Para o Hibernate funcionar corretamente
29
Mecanismos de persistênciaExistem três tipos de objetos:
• “transient” (transientes)• “detached” (desligados)• “persistent” (persistentes)
Persistência em casacataPersistência em casacata 30
Criar uma classe para configurar e abrir as sessões do Hibernate
//Arquivo HibernateUtility.javaimport org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtility {private static SessionFactory factory;static {try {factory = new Configuration().configure().buildSessionFactory();} catch (Exception e) {e.printStackTrace();factory = null;}}public static Session getSession() {return factory.openSession();}}
Sessão e transaçãoSessão e transação
Projeto de BD
31
Observar se tudo esta funcionandopublic class Teste {public static void main(String[] args) {Session sessao = HibernateUtility.getSession(); //Abrindo uma sessãoTransaction transaction = sessao.beginTransaction(); //Iniciando uma
transaçãoCurso curso = new Curso(); //Instanciando um objeto transientecurso.setNome("Desenvolvimento de Software"); //Preenchendo as
propriedades do objetocurso.setDescricao("Curso só pra programadores");sessao.save(curso); //Transformando o objeto transiente em um objeto//persistente no banco de dadostransaction.commit(); //Finalizando a transaçãosessao.close(); //Fechando a sessão}}
32
Abrir uma sessão doHibernateSession sessao = HibernateUtility.getSession();Transaction tx = sessao.beginTransaction();Query select = sessao.createQuery("from Turma");List objetos = select.list();System.out.println(objetos);tx.commit();sessao.close();
Fazendo pesquisas no banco usando o Hibernate
Fazendo pesquisas no banco usando o Hibernate
33
Insert/Update
Public void insert(Usuario user) {//inicializa a factory de sessoes do HibernateSessionFactory sessionFactory=new
Configuration().configure().buildSessionFactory();//abre uma nova sessãoSession session = sessionFactory.openSession(); //inicia uma transaçãoTransaction tx = session.beginTransaction(); //persiste o objetosession.saveOrUpdate(user); tx.commit(); //da commit na transaçãosession.close(); //fecha a sessãoo}
34
Delete
Public void delete(Usuario user) {SessionFactory sessionFactory=new
Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction();session.delete(user); //remove usuariotx.commit();session.close(); }
35
Consultas
Public ArrayList getUsuarios() { SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession(); ArrayList arrayList = null;//equivale a select * FROM tb_usuarioString SQL_STRING = "FROM Usuario as users";Query query = session.createQuery(SQL_STRING);ArrayList list = (ArrayList)query.list();session.close();Return list; }
36
Identidade/Igualdade entre Objetos Exemplo:
obj1 == obj2
obj1.equals(obj2)
Classes PersistentesClasses Persistentes 37
Escolhendo Chaves Primárias •Única;
•Nunca ser nula;
•Constante.
38
Objetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e Detached
Nas diversas aplicações existentes, sempre que for necessário propagar o estado
de um objeto que está em memória para o banco de dados ou vice-
versa, há a necessidade de que a aplicação interaja com uma camada
de persistência.
39
Objetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e Detached40
41
AnnotationsAnnotationsAnnotationsAnnotations
As anotações podem ser definidas como metadados que aparecem no código fonte e são ignorados pelo compilador. Qualquer símbolo em um código Java que comece com uma @ (arroba) é uma anotação.
42
•@Length(min=3,max=100) private String name;
•@Email private String email;
•@Min(5) private String password;
43Annotations - ExemplosAnnotations - ExemplosAnnotations - ExemplosAnnotations - Exemplos
Escreva classes compactas e mapeie-as usando <component>;
Identifique chaves naturais;
Coloque cada classe de mapeamento em seu próprio arquivo;
Carregue os mapeamentos como recursos;
Não gerencie suas conexões JDBC.
Boas PráticasBoas PráticasBoas PráticasBoas Práticas 44