Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect...

31
Hibernate Mecanismo de Persistência Marco Antonio, Arquiteto de Software – TJDF [email protected] Dezembro/2005

Transcript of Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect...

Page 1: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Hibernate

Mecanismo de Persistência

Marco Antonio, Arquiteto de Software – TJDF

[email protected]

Dezembro/2005

Page 2: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

HibernateMecanismo de persistência (operações em banco como inserir, atualizar, consultar e excluir).Ferramenta de mapeamento objeto/relacional.Fornece consultas e outras facilidades que podem reduzir sensivelmente o tempo de desenvolvimento.Não é recomendado para ambientes com muitas stored-procedures.

Page 3: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

ProjetoAloMundoHibernateCrie o ProjetoAloMundoHibernate, que será nosso ponto inicial.Dentro do projeto, crie um diretório lib, onde estarão todas as bibliotecas necessárias para acessar o Hibernate.

Você pode fazer o download no site www.hibernate.org.

Clique com o botão direito sobre cada uma das bibliotecas – Build Path – Add to Build Path.

Page 4: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Estrutura de diretóriosO resultado final, deve ser parecido com o que você vê ao lado.

Page 5: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Principais arquivos do exemploPessoa.java – classe persistente.Pessoa.hbm.xml – arquivo de mapeamento objeto-relacional.hibernate.cfg.xml – arquivo de configuração do hibernate.hibernate.properties – propriedades da nossa conexão com o banco de dados.log4j.properties (opcional) – log do hibernate, bastante útil em tempo de desenvolvimento.

Page 6: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoapackage com.alomundo.hibernate;import java.sql.*;public class Pessoa { private long id; private String nome; private String endereco; private String telefone; private Date dataDeNascimento; public Date getDataDeNascimento() { return dataDeNascimento; } public void setDataDeNascimento(Date dataDeNascimento) { this.dataDeNascimento = dataDeNascimento; } public String getEndereco() { return endereco; }

Page 7: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoa public void setEndereco(String endereco) { this.endereco = endereco; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; }

Page 8: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoa public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; }}

Page 9: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoa.hbm.xml<?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="com.alomundo.hibernate.Pessoa"> <id name="id" column="id" type="java.lang.Long"> <generator class="sequence"> <param name="sequence">pessoa_id_sequence</param> </generator> </id> <property name="nome" /> <property name="endereco" /> <property name="telefone" /> <property name="dataDeNascimento" /> </class></hibernate-mapping>

Page 10: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoa.hbm.xmlArquivo de configuração para a classe.O Hibernate utiliza esse arquivo para fazer o mapeamento entre a classe e a tabela.Cuidado especial para as características proprietárias de cada banco de dados.

A sequence é um recurso do PostgreSQL para geração de chave-primária.

Deve existir um arquivo de configuração para cada classe.

Page 11: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Pessoa.hbm.xmlEsse mapeamento é feito através de reflexão, ou seja, quando você não informa o tipo de dado da propriedade, o Hibernate supõe que é do mesmo tipo que está na classe.Dica: Quando houver relacionamentos entre classes, acrescente a tag

<many-to-one name=”nomeDoAtributoDoRelacionamento” />

Page 12: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

hibernate.cfg.xml<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <mapping resource="com/alomundo/hibernate/Pessoa.hbm.xml" /> </session-factory></hibernate-configuration>

Page 13: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

hibernate.cfg.xmlArquivo de configuração do Hibernate.Acrescente aqui todas as classes persistentes que você deseja mapear para o banco de dados.

Page 14: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

hibernate.propertieshibernate.connection.driver_class = org.postgresql.Driverhibernate.connection.url = jdbc:postgresql://localhost:5432/alomundohibernate.connection.username = postgreshibernate.connection.password = aindahibernate.dialect = org.hibernate.dialect.PostgreSQLDialecthibernate.show_sql = true#hibernate.hbm2ddl.auto = create

Page 15: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

hibernate.propertiesPropriedades da conexão com o banco de dados.Informações como nome do database, usuário e senha ficam aqui.A linha #hibernate.hbm2ddl.auto = create deve estar descomentada apenas na primeira vez que você rodar o exemplo, caso contrário, irá recriar a tabela sempre que executarmos os testes.

Page 16: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

log4j.propertieslog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%nlog4j.rootLogger=warn, stdoutlog4j.logger.org.hibernate=infolog4j.logger.org.hibernate.type=infolog4j.logger.org.hibernate.tool.hbm2ddl=debug

Page 17: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

log4j.propertiesConfiguração básica para o log dessa aplicação de teste.

Page 18: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Fábricas e sessões no HibernateO Hibernate fornece duas classes que centralizam todas as funcionalidades de um banco de dados:

Session – tem os métodos save, update, delete e createQuery.SessionFactory – cria uma sessão com o banco de dados.

Page 19: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Hibernate X transaçõesPara garantir a integridade das informações, o Hibernate utiliza transações.Todas as operações que alteram registros no banco devem utilizar uma transação.

Page 20: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaSavepackage com.alomundo.hibernate;

import java.sql.*;import java.text.*;import org.hibernate.*;import org.hibernate.cfg.*;

public class TesteDaPessoaSave { public static void main(String[] args) { try {1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();2. Session sessao = fabrica.openSession();3. Pessoa pessoa = new Pessoa();4. pessoa.setNome("Marco Antonio");5. pessoa.setEndereco("CNB 14 LOTE 10");6. pessoa.setTelefone("33521134");

Page 21: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaSave7. SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");8. long horaEmMilis = formatador.parse("06/04/1979").getTime();9. Date data = new Date(horaEmMilis);10. pessoa.setDataDeNascimento(data);11. Transaction tx = sessao.beginTransaction();12. sessao.save(pessoa);13. tx.commit(); } catch (Exception e) { e.printStackTrace(); } }}

Page 22: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaSave1. O Hibernate lê os arquivos hibernate.properties/hibernate.cfg.xml e faz todas as

validações necessárias no banco de dados. Analisa se existem todas as tabelas, os relacionamentos e cria o que estiver faltando, se for o caso.

2. Através da fábrica, cria uma sessão com a base de dados.3, 4, 5, 6. cria o objeto Pessoa e informa os valores que devem ser persistidos.7, 8, 9, 10 (opcional). rotina para recuperação de datas. 11. cria a transação (obrigatória), pois iremos criar um novo registro.12. salva a pessoa na da sessao atual (veja os dados da sessão no arquivo

hibernate.properties).13. salva os dados na tabela Pessoa do banco de dados.

Page 23: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaLoadpackage com.alomundo.hibernate;

import org.hibernate.*;import org.hibernate.cfg.*;

public class TesteDaPessoaLoad { public static void main(String[] args) {1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();2. Session sessao = fabrica.openSession();3. Pessoa pessoa = (Pessoa) sessao.load(Pessoa.class, new Long(5));4. System.out.println("Dados recuperados");5. System.out.println(pessoa.getNome());6. System.out.println(pessoa.getEndereco());7. System.out.println(pessoa.getTelefone());8. System.out.println(pessoa.getDataDeNascimento()); }}

Page 24: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaLoad1, 2. configura a fábrica e abre a sessão com o banco.3. sessao.load(Pessoa.class, new Long(5)) – recupera a Pessoa que tem o ID igual a 5.

Utiliza um mecanismo chamado cast converte o resultado para o objeto desejado (Pessoa). O cast é específico para cada classe que você deseja recuperar.

4 – 8. imprime na tela os dados recuperados do banco de dados.

Page 25: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaDeletepackage com.alomundo.hibernate;

import org.hibernate.*;import org.hibernate.cfg.*;

public class TesteDaPessoaDelete { public static void main(String[] args) {1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();2. Session sessao = fabrica.openSession();3. Pessoa pessoa = (Pessoa) sessao.load(Pessoa.class, new Long(5));4. Transaction tx = sessao.beginTransaction();5. sessao.delete(pessoa);6. tx.commit(); }}

Page 26: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaDeleteObs: para excluir uma pessoa, você deve, primeiro, consultá-la na base.1, 2. configura a fábrica e abre a sessão com o banco.3. recupera a pessoa com o ID igual a 5.4. inicia a transação (obrigatória), pois um registro será excluído.5. exclui o objeto da sessao.6. exclui o objeto no banco de dados.

Page 27: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaUpdatepackage com.alomundo.hibernate;

import org.hibernate.*;import org.hibernate.cfg.*;

public class TesteDaPessoaUpdate { public static void main(String[] args) {1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();2. Session sessao = fabrica.openSession();3. Pessoa pessoa = (Pessoa) sessao.load(Pessoa.class, new Long(6));4. Transaction tx = sessao.beginTransaction();5. pessoa.setEndereco("Novo Endereço");6. sessao.update(pessoa);7. tx.commit(); }}

Page 28: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

TesteDaPessoaUpdateObs: para atualizar uma pessoa, você deve, primeiro, consultá-la na base.1, 2. configura a fábrica e abre a sessão com o banco.3. recupera a pessoa com o ID igual a 6.4. inicia a transação (obrigatória), pois um registro será atualizado.5. o valor do atributo é modificado.6. o objeto é modificado na sessão.7. os dados do registro no banco de dados são finalmente atualizados.

Page 29: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

Dúvidas?

Page 30: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

ExercíciosUtilize o Hibernate para fazer o mapeamento da classe Gerente.Crie as classes de teste para inclusão, alteração, exclusão e consulta.

Page 31: Hibernate Mecanismo de Persistência · hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.show_sql = true #hibernate.hbm2ddl.auto = create. hibernate.properties

DesafioUtilize o Hibernate para fazer o mapeamento da classe Agencia. Obs: Essa classe tem um relacionamento!!!Crie as classes de teste para inclusão, alteração, exclusão e consulta.