You are on page 1of 44

Andrêsa Cibelly

Clébia Alves
Cleyton Vanut
Mouglas Eugênio
Ronnie Santos

07/12/21
2
O.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.
3
Hibernate - 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.

Objeto
Tabela
Hibernate - Definição 4
5

Fazer a transformação sem Hibernate


6
7
Características
-Transformação das classes em Java para
tabelas de dados

je ti vo : d i m inuir a
Ob tre os
le x id a d e e n
comp
og ra m a s J a va, que
pr a r com um
t r a b alh
precisam d o modelo
d e d a d o s
banco
relacional.

- 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
8
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”


9
Vantagens Desvantagens

O desenvolvedor se livra de Sistemas que fazem uso extensivo


escrever muito do código de acesso de:
ao BD;
stored procedures
Acelera a velocidade de triggers
desenvolvimento; maior parte da lógica da aplicação
no banco de dados,
Os arquitetos podem se preocupar
mais com as regras de negócios; não vão se beneficiar com o uso do
Hibernate
Melhor tratamento de exceções;
10
11
Mapeamento

- Hibernate é um Persistência usando Hibernate


Framewok para
mapeamento
Objeto/Relacional Possibilita desenvolver classes
em Java persistentes usando Java
convencional:

Associação
- Visa facilitar, para
Composição
os Herança
desenvolvedores, a Polimorfismo
implementação da
camada de e coleções Java
persistência da
aplicação
12
Persistê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>.
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>
14
Mapeamento e Associações
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"/>
15

Mapeamento muitos-para-um
com Cliente -> Dependentes
<many-to-one name="cliente"
column="CLIENTE_ID"
class="Cliente"
not-null="true"/>
16
Arquitetura
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 Camada de Persistência


(Business Layer) (Persistence Layer)
Esta camada é responsável em A camada de persistência
implementar todo código compreende o grupo de classes
responsável pela lógica de responsáveis em persistir
negócio. Boa parte da dados e informações, como
complexidade do sistema é também, recuperá-los e
implementada e resolvida por gerenciá-los de forma eficiente.
esta camada.
17
18
API 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. Instanciar um objeto de configuração


Configuration) (org.hibernate.cfg.Configuration) e
inserir suas propriedades
Geralmente obtém a configuração via programaticamente;
arquivos XML ou propriedades
dinâmicas. Usar um arquivo .properties com as
É o ponto de partida para iniciar o suas configurações e indicar os
Hibernate; arquivos de mapeamento
programaticamente;
Define-se diversas configurações do
Hibernate; por exemplo: Usar um arquivo XML
(hibernate.cfg.xml) com as
O dialeto do BD a ser utilizado, propriedades de inicialização e os
senha do banco, usuário, etc. caminhos dos arquivos de
Cria a SessionFactory;
mapeamento.
19

Import org.apache.log4j.BasicConfigurator;
import org.hibernate.cfg.Configuration;
public class BemVindoHibernate {
public static void main(String[]
args) { // Configura Log4j sem exigir arquivo
BasicConfigurator.configure();
// Hibernate procura por
'hibernate.properties‘. Deve estar disponível no
CLASSPATH
new Configuration();
System.out.println("Bem-vindo ao curso
de Hibernate"); }
}
20

SessionFactory(org.hibernate.Session
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();
21

Transaction(org.hibernate.Tr Exemplo:
ansaction)
import org.hibernate.Session;
É uma API opcional do import org.hibernate.SessionFactory;
Hibernate; import org.hibernate.Transaction;
Abstração da implementação import
de transações usada no org.hibernate.cfg.Configuration;
código
A implementação real public class InsereA {
pode ser uma transação public static void
JTA, JDBC, etc. main(String[] args) {
Essencial para garantir a Configuration cfg = new
portabilidade de aplicação
entre diferentes ambientes e Configuration().configure();
containers; 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(); }
}
22

Criteria e Query
Critério é uma alternativa que faz
As consultas Query são feitas em a mesma coisa usando métodos da
SQL(Structured Query Language) ou API (em Java, em vez de HQL);
HQL(Hibernate Query Language);
Objetos Query são usados para:
- Passar parâmetros para a consulta Uma Query só pode ser usada
em HQL; dentro de sua sessão;
- Filtrar resultados;
- Executar os comandos da consulta;

Exemplo:

String hql=
“from Produto where preco>:preco”;
Query
query=session.createQuery(hql);
query.setDouble(“preco”,25,0);
List results=query.list();
23
Identidade

Em Java:
Object.equals(Object ob);

O banco só entende tabelas


24

A solução é a chave
//Listagem do arquivo Pessoa.java
public class Pessoa {
private String nome;
private String email;
private String telefone;
private Endereco endereco;
private Integer id;
//métodos getters e setters das propriedades
}
25
26
Arquivo de Mapeamento
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//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-one
name="endereco"
class="Endereco"
cascade="save-update"/>
</class>
</hibernate-mapping>
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//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-one
name="pessoa"
class="Pessoa"
constrained="true"/>
</class>
</hibernate-mapping>
28
Herança

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE hibernate-mapping
PUBLIC "-//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>
29
Entendendo melhor o “inverse”
Professor professor = new Professor();
Turma turma = new Turma();
turma.setProfessor(professor);
professor.getTurmas().add(turma);

Configurando...
Para o Hibernate funcionar corretamente
30
Persistência em casacata

Mecanismos de persistência
Existem três tipos de objetos:

• “transient” (transientes)
• “detached” (desligados)
• “persistent” (persistentes)
31
Sessão e transação

Criar uma classe para configurar e abrir as


sessões do Hibernate
//Arquivo HibernateUtility.java
import 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();
}
}

Projeto de BD
32

Observar se tudo esta funcionando


public class Teste {
public static void main(String[] args) {
Session sessao = HibernateUtility.getSession(); //Abrindo uma sessão
Transaction transaction = sessao.beginTransaction(); //Iniciando uma
transação
Curso curso = new Curso(); //Instanciando um objeto transiente
curso.setNome("Desenvolvimento de Software"); //Preenchendo as
propriedades do objeto
curso.setDescricao("Curso só pra programadores");
sessao.save(curso); //Transformando o objeto transiente em um objeto
//persistente no banco de dados
transaction.commit(); //Finalizando a transação
sessao.close(); //Fechando a sessão
}
}
33
Fazendo pesquisas no banco usando o
Hibernate
Abrir uma sessão do
Hibernate
Session 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();
34

Insert/Update

 
Public void insert(Usuario user) {
//inicializa a factory de sessoes do Hibernate
SessionFactory sessionFactory=new
Configuration().configure().buildSessionFactory();
//abre uma nova sessão
Session session = sessionFactory.openSession();
//inicia uma transação
Transaction tx = session.beginTransaction();
//persiste o objeto
session.saveOrUpdate(user);
tx.commit(); //da commit na transação
session.close();
//fecha a sessãoo
}
35

Delete

Public void delete(Usuario user) {


SessionFactory sessionFactory=new
Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.delete(user); //remove usuario
tx.commit();
session.close();
}
36

Consultas
Public ArrayList getUsuarios() {
 
SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
ArrayList arrayList = null;
//equivale a select * FROM tb_usuario
String SQL_STRING = "FROM Usuario as users";
Query query = session.createQuery(SQL_STRING);
ArrayList list = (ArrayList)query.list();
session.close();
Return list;
}
37
Classes Persistentes

Identidade/Igualdade entre Objetos


Exemplo:

obj1 == obj2

obj1.equals(obj2)
38

Escolhendo Chaves Primárias


• Única;

• Nunca ser nula;

• Constante.
39
Objetos 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.
40
Objetos Persistentes, Transientes e Detached
41
42
Annotations

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.
43
Annotations - Exemplos

• @Length(min=3,max=100)
private String name;

• @Email
private String email;

• @Min(5)
private String password;
44
Boas Práticas
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.

You might also like