Introdução ao Hibernate

44
Andrêsa Cibelly Andrêsa Cibelly Clébia Alves Clébia Alves Cleyton Vanut Cleyton Vanut Mouglas Eugênio Mouglas Eugênio Ronnie Santos Ronnie Santos 22/05/22

description

Seminário apresentado na turma de Projeto de Banco de Dados 2010.1 no Curso de Bacharelado em Sistemas de Informação. Universidade Federal Rural de Pernambuco - Unidade Acadêmica de Serra Talhada.

Transcript of Introdução ao Hibernate

Page 1: 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

Page 2: Introdução ao Hibernate

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

Page 3: Introdução ao Hibernate

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

Page 4: Introdução ao Hibernate

Hibernate - DefiniçãoHibernate - DefiniçãoHibernate - DefiniçãoHibernate - Definição 4

Page 5: Introdução ao Hibernate

5

Fazer a transformação sem Hibernate

Page 6: Introdução ao Hibernate

6

Page 7: Introdução ao Hibernate

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

Page 8: Introdução ao Hibernate

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

Page 9: Introdução ao Hibernate

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

Page 10: Introdução ao Hibernate

10

Page 11: Introdução ao Hibernate

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

Page 12: Introdução ao Hibernate

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

Page 13: Introdução ao Hibernate

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>

Page 14: Introdução ao Hibernate

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

Page 15: Introdução ao Hibernate

15

Mapeamento muitos-para-um com Cliente -> Dependentes <many-to-one name="cliente" column="CLIENTE_ID" class="Cliente" not-null="true"/>

Page 16: Introdução ao Hibernate

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

Page 17: Introdução ao Hibernate

17

Page 18: Introdução ao Hibernate

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

Page 19: Introdução ao Hibernate

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

Page 20: Introdução ao Hibernate

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

Page 21: Introdução ao Hibernate

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

Page 22: Introdução ao Hibernate

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

Page 23: Introdução ao Hibernate

Em Java:Object.equals(Object ob);

O banco só entende tabelas

IdentidadeIdentidade 23

Page 24: Introdução ao Hibernate

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

Page 25: Introdução ao Hibernate

25

Page 26: Introdução ao Hibernate

<?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

Page 27: Introdução ao Hibernate

<?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

Page 28: Introdução ao Hibernate

<?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

Page 29: Introdução ao Hibernate

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

Page 30: Introdução ao Hibernate

Mecanismos de persistênciaExistem três tipos de objetos:

• “transient” (transientes)• “detached” (desligados)• “persistent” (persistentes)

Persistência em casacataPersistência em casacata 30

Page 31: Introdução ao Hibernate

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

Page 32: Introdução ao Hibernate

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

Page 33: Introdução ao Hibernate

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

Page 34: Introdução ao Hibernate

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

Page 35: Introdução ao Hibernate

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

Page 36: Introdução ao Hibernate

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

Page 37: Introdução ao Hibernate

Identidade/Igualdade entre Objetos Exemplo:

obj1 == obj2

obj1.equals(obj2)

Classes PersistentesClasses Persistentes 37

Page 38: Introdução ao Hibernate

Escolhendo Chaves Primárias •Única;

•Nunca ser nula;

•Constante.

38

Page 39: Introdução ao Hibernate

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

Page 40: Introdução ao Hibernate

Objetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e DetachedObjetos Persistentes, Transientes e Detached40

Page 41: Introdução ao Hibernate

41

Page 42: Introdução ao Hibernate

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

Page 43: Introdução ao Hibernate

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

•@Email private String email;

•@Min(5) private String password;

43Annotations - ExemplosAnnotations - ExemplosAnnotations - ExemplosAnnotations - Exemplos

Page 44: Introdução ao Hibernate

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