Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Persistncia
Define como guardar os dados em um banco de dados. Todo sistema persistente? Como realizada atualmente?
Soluo MOR
Uma soluo MOR consiste em: Fornecer uma API para realizar operaes CRUD Uma linguagem ou API para especificar consultar Uma facilidade para especificar o metadado de mapeamento
Hibernate
O Hibernate uma ferramenta MOR completa, que fornece todos os benefcios de um MOR citados. O Hibernate um framework de mapeamento objeto relacional para aplicaes Java. Disponibiliza um poderoso mecanismo de consulta de dados, permitindo uma reduo considervel no tempo de desenvolvimento da aplicao. Portvel para qualquer banco de dados relacional.
Hibernate
Hibernate Core Hibernate Annotations Hibernate EntityManager www.hibernate.org
Classes Persistentes
As classes persistentes de uma aplicao so aquelas que implementam as entidades do negcio. O Hibernate trabalha associando cada tabela do banco de dados a um POJO (Plain Old Java Object). POJOs so objetos Java que seguem a estrutura de JavaBeans So criados sempre no pacote model.bean
Classes Persistentes
Consideraes:
O Hibernate requer que toda classe persistente possua um construtor padro sem argumentos. O Hibernate persiste as propriedades no estilo JavaBeans utilizando os mtodos getters e setters. Todos os objetos persistentes devem possuir um identificador.
Annotations
O mapeamento objeto relacional utilizando Hibernate pode ser feito a partir de anotaes. As anotaes podem ser definidas como metadados que aparecem no cdigo fonte e so ignorados pelo compilador. Qualquer smbolo em um cdigo Java que comece com uma @ (arroba) uma anotao.
Annotations
Este recurso foi introduzido na linguagem Java a partir da verso Java SE 5.0. Em outras palavras, as anotaes marcam partes de objetos de forma que tenham algum significado especial.
Hibernate Annotations
Inicialmente, para que o Hibernate soubesse como carregar e armazenar objetos de classes persistentes, eram utilizados apenas arquivos de mapeamentos XML. Informar que tabela do banco de dados se refere uma dada classe persistente e quais colunas na tabela so referentes a quais atributos da classe.
Hibernate Annotations
Com o surgimento das anotaes no Java 5.0, tornou-se possvel substituir os arquivos XML atravs do uso de um conjunto de anotaes no cdigo fonte das classes mapeadas.
Hibernate Annotations
Todas as classes persistentes mapeadas com anotaes so declaradas usando a anotao @Entity. Exemplo: @Entity public class Pessoa{ ... }
Hibernate Annotations
Quando o nome da classe diferente do nome da tabela para a qual mapeada necessrio informar na anotao @Table qual o nome da tabela, usando o atributo name. Exemplo: @Entity @Table(name=pessoa) public class Pessoa{ ... }
Hibernate Annotations
Hibernate Annotations
A chave primria da tabela mapeada na classe atravs da anotao @Id. Exemplo: @Entity @Table(name=pessoa) public class Pessoa{ @Id private int idPessoa; ... }
Hibernate Annotations
Se o nome da coluna anotada com @Id for diferente, necessrio utilizar a anotao @Column informando o nome da coluna, atravs do atributo name. Exemplo:
@Entity @Table(name=pessoa) public class Pessoa{ @Id @Column(name=idpessoa) private int idPessoa; ...
Hibernate Annotations
Hibernate Annotations
Demais atributos da classe sero anotados com @Column(name = ) somente quando o nome do atributo for diferente do nome do campo.
Hibernate - Arquitetura
Session (org.hibernate.Session)
Possibilita a comunicao entre a aplicao e a persistncia, atravs de uma conexo JDBC. um objeto leve de ser criado. Com ele possvel criar, remover, atualizar e recuperar objetos persistentes.
SessionFactory (org.hibernate.SessionFactory)
Mantm o mapeamento objeto relacional em memria. um objeto pesado de ser criado. Permite a criao de objetos Session.
Hibernate - Arquitetura
Configuration (org.hibernate.Configuration)
Utilizado para realizar as configuraes de inicializao do Hibernate:
Driver do banco de dados. Usurio e senha do banco.
Transaction (org.hibernate.Transaction)
Utilizada para representar uma unidade indivisvel de uma operao de manipulao de dados.
Persistindo Objeto
Instancia objeto Pessoa: Pessoa pessoa = new Pessoa(); Seta atributos: pessoa.setIdPessoa(1); pessoa.setNome(Ronaldo!); Abre uma transao: Transaction t = session.beginTransaction(); Persiste o objeto: session.saveOrUpdate(pessoa); Aplica as alteraes na base: t.commit(); Fecha a sesso: session.close();
Exemplo:
session.get(Pessoa.class, 1);
Aps executada a consulta, podemos mostrar os dados recuperados usando os metodos getters do bean, exemplo:
JOptionPane.showMessageDialog(null, pessoa.getNome());
Este mtodo retorna uma lista, ento faremos com que o resultado seja atribudo a uma lista. Utilizando a classe Pessoa como exemplo temos:
List<Pessoa> lista = session.createCriteria(Pessoa.class).list();
Manipulando Dados
Salvar ou Atualizar:
session.saveOrUpdate(objeto);
Remover:
session.delete(objeto);
Busca:
session.get(Classe, Valor ID);
Busca todos:
session.createCriteria(Classe).list();
Hibernate Annotations
Anotao @Temporal:
TemporalType.DATE: usado para mapear datas; TemporalType.TIME: usado para mapear hora; TemporalType.TIMESTAMP: usado para mapear datas e hora.
Hibernate Annotations
Exerccio: Criar uma classe para persistir as seguintes informaes:
Atributo IDTipos tipoInteiro tipoCaracter tipoBooleano tipoCasaDecimal tipoData tipoHora tipoDataHora Tipo Classe Long Integer String Boolean BigDecimal Date Date Date Campo idtipos tipointeiro tipocaracter tipobooleano tipocasadecimal tipodata tipohora tipodatahora Tipo BD numeric(18) integer text boolean numeric(15,2) date time without time zone timestamp without time zone
Organizando a aplicao
Aplica-se o padro de projeto MVC(Model, View e Controler) Na camada View ficaro as interfaces Na camada Model ficaro os beans e os DAOs Na camada Controler ficaro as classes controladoras. Criar um pacote chamado Util, onde todas as camadas podero ter acesso.
Organizando a aplicao
At o momento... as interfaces foram criadas dentro da camada View. os beans foram criados dentro da camada Model a camada View est acessando diretamente a Model para manipular os dados, o que no permitido no padro MVC.
Organizando a aplicao
No padro MVC:
A View acessa solicita ao controler que manipule os dados(inserir, alterar, remover, consultar) O Controler por sua vez faz as modificaes solicitadas atravs das classes DAOs da camada Model.
Organizando a aplicao
Classes que devero ser construdas:
Camada View
Todas as interfaces
Camada Controler
Classes com mtodos para manipular os dados de cada interface
Camada Model
Classes DAOs que manipulam os dados diretamente no banco de dados Classes Beans
Pacote Util
No pacote Util, dever ser criada a classe HibernateUtil.java, que ter um mtodo esttico que retornar uma session.
Camada Model
As classes DAOs devero ser criadas no pacote dao, dentro de model:
Camada Model
Primeira classe a criar neste pacote a DaoFactory.java que permitir:
Abrir uma transao Efetuar Commit Efetuar Rollback Fechar Sesso Retornar as classes DAO
DaoFactory.java
import br.com.faculdadeiguacu.tesi.util.HibernateUtil; import org.hibernate.Session; import org.hibernate.Transaction; public class DaoFactory { private final Session session; private Transaction transaction; public DaoFactory() { this.session = HibernateUtil.getSession(); } public void beginTransaction(){ this.transaction = this.session.beginTransaction(); }
DaoFactory.java
public void commit(){ this.transaction.commit(); this.transaction = null; } public boolean hasTransaction(){ return this.transaction != null; } public void rollback(){ this.transaction.rollback(); this.transaction = null; } public void close(){ this.session.close(); } }
Classes DAO
Neste mesmo pacote devero ser criadas as classes que fornecero os mtodos para manipular os dados(Inserir, Alterar, Excluir, Consultar) chamadas de classes DAO. So construdas para cada bean da aplicao. O nome da classe formado pelo nome do bean + a palavra Dao.
Exemplo: PessoaDao
PessoaDao.java
PessoaDao.java
PessoaDao.java
PessoaDao.java
import br.com.faculdadeiguacu.tesi.model.bean.Pessoa; import java.util.List; import org.hibernate.Session; public class PessoaDao { private Session session; public PessoaDao(Session session) { this.session = session; } public void salvar(Pessoa Pessoa){ session.saveOrUpdate(Pessoa); }
PessoaDao.java
public void remover(Pessoa Pessoa){ session.delete(Pessoa); } public Pessoa buscar(int id){ return (Pessoa)session.get(Pessoa.class, id); } public List<Pessoa> buscarTodos(){ return session.createCriteria(Pessoa.class).list(); } }
Camada Controler
Nesta camada sero construdas as classes que tero acesso aos mtodos da classes DAO. Normalmente so construdas para cada interface, pois as interfaces tero acesso a ela para executar suas operaes (inserir, atualizar, remover, consultar).
Camada Controler
Nesta camada sero construdas as classes que tero acesso aos mtodos da classes DAO. As classes controler devero ser criadas dentro do pacote controler.
Camada Controler
Classe PessoaControler.java
Classe PessoaControler.java
Classe PessoaControler.java
Classe PessoaControler.java
import import import import br.com.faculdadeiguacu.tesi.model.bean.Pessoa; br.com.faculdadeiguacu.tesi.model.dao.DaoFactory; br.com.faculdadeiguacu.tesi.model.dao.PessoaDao; java.util.List;
public class PessoaControler { private DaoFactory daoFactory; private PessoaDao pessoaDao; public PessoaControler() { daoFactory = new DaoFactory(); pessoaDao = daoFactory.getPessoaDao(); } public void salvar(Pessoa Pessoa){ daoFactory.beginTransaction(); pessoaDao.salvar(Pessoa); daoFactory.commit(); }
Classe PessoaControler.java
public void remover(Pessoa Pessoa){ daoFactory.beginTransaction(); pessoaDao.remover(Pessoa); daoFactory.commit(); }
public Pessoa buscar(int id){ return pessoaDao.buscar(id); } public List<Pessoa> buscarTodos(){ return pessoaDao.buscarTodos(); }
Associaes
O termo associao utilizado para se referir aos relacionamentos entre as entidades. Os relacionamentos n-para-n, n-para-1 e 1-para-n so os mais comuns entre as entidades de um banco de dados.
Associaes
Relacionamento entre Cidade e Pessoa. Uma cidade possui um conjunto de n pessoas e uma pessoa est associada a apenas uma nica cidade. Precisamos definir as associaes para representar os relacionamentos do banco de dados.
Associaes
Para exemplificar as associaes, crie:
Tabela na base de dados chamada cidade, com os atributos idcidade e nome; Criar chave primria; Definir chave estrangeira na tabela pessoa; Precisa criar o campo idcidade. Classe chamada Cidade e coloque os atributos da tabela; Torne a classe persistente; Crie o Dao e o Controlador para a classe Cidade. Incluir no DaoFactory o metodo getDaoCidade.
Associaes
Gerar metodos getters e setters. A anotao @JoinColumn utilizada para informar qual o nome da coluna que corresponde chave estrangeira do relacionamento entre as tabelas cidade e pessoa.
Associaes
Anotao Cascade:
Serve para indicar com que ao em cascata o relacionamento ser tratado. Incluir a anotao @Cascade(CascadeType.ALL) no atributo da classe Professor onde h associao. Imports:
import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType;
Associaes
Atributo fetch:
Indica quando o contedo do atributo anotado ser trazido da base de dados. Valores:
FetchType.EAGER FetchType.LAZY
Exemplo:
@OneToMany(mappedBy=professor", fetch = FetchType.LAZY)
Exerccio
A partir do diagrama a seguir, desenvolver as classes persistentes, as tabelas no banco de dados e uma classe principal para inserir, remover e consultar informaes.
A anotao JoinTable indica a tabela intermediria da relao n-n. Devem ser preenchidos os atributos:
name: que o nome da tabela intermediria; joinColumns: recebe como parametro @JoinColumn que informa qual a coluna na tabela intermediria; inverseJoinColumns: recebe como parametro @JoinColumn que informa a coluna que representa a outra tabela no relacionamento;
O primeiro passa os dados da tela para um bean. O segundo passa os dados do bean para os componentes da tela.
Interface de Consulta
Criar classe ConsultarPessoaView.java Adicionar:
Jlabel: mudar texto para Nome: JTextField: renomear para jTfNome JTable: renomear para jTblDados JButton: mudar texto para Ok JButton: mudar texto para Cancelar
Interface de Consulta
Interface de Consulta
Interface de Consulta
Interface de Consulta
Criar a varivel de classe:
private DefaultTableModel model = new DefaultTableModel(); Private PessoaControler pessoaControler = new PessoaControler();
Interface de Consulta
Criar dois mtodos:
carregaCabecalho(); carregaDados();
Interface de Consulta
private void carregaCabecalho(){ Vector<String> v = new Vector<String>(); v.add("Cdigo"); v.add("Nome"); model.setDataVector(null, v); carregaDados(); }
Interface de Consulta
private void carregaDados(){ List<Pessoa> list = pessoaControler.buscarTodos(); for (Pessoa pessoa : list) { model.addRow(new Object[]{ pessoa.getIdPessoa(), pessoa.getNome() }); } }
Interface de Consulta
Interface de Consulta
Criar varivel de classe: Pessoa pessoa = null;
Criar mtodos
selecionar getPessoa
Interface de Consulta
Interface de Consulta
Chamar o mtodo selecionar(); no boto OK. No boto Cancelar colocar o cdigo:
pessoa = null;
Interface de Consulta
Na classe PessoaView, no mtodo consultar, adicionar o seguinte cdigo:
ConsultarPessoaView c = new ConsultarPessoaView(null, true); c.setVisible(true); Pessoa p = c.getPessoa(); if (p != null){ setDadosTela(p); }else{ cancelar(); }
Interface de Consulta
Interface de Consulta
Ainda preciso que a classe de consulta de pessoas retorne as pessoas quando for informado seu nome. Para que isso acontea, preciso criar uma consulta na classe PessoaDao e fazer com que a classe PessoaControle tenha acesso a ela.
Interface de Consulta
Classe PessoaControler:
Adicionar um mtodo que chama a consulta criada na classe PessoaDao: public List<Pessoa> buscarPorNome(String nome){ return pessoaDao.buscarPorNome(nome); }
Interface de Consulta
Classe ConsultarPessoaView:
Interface de Consulta
Assim, quando qualquer tecla for pressionada, ser chamado o mtodo de consulta, passando o que foi digitado:
Interface de Consulta
A seguir preciso modificar o mtodo carregaDados:
private void carregaDados(String nome){ int cont = model.getRowCount(); for(int i = 0; i < cont; i++){ model.removeRow(0); } List<Pessoa> list = pessoaControler.buscarPorNome(nome); for (Pessoa p : list) { model.addRow(new Object[]{ p.getIdPessoa(), p.getNome() }); } }
Interface de Consulta
p.setCidade((Cidade)jCmbCidade.getSelectedItem());
Para o caso I. e III. deve haver uma seqncia no banco de dados chamada de hibernate_sequence. Para usar uma sequencia definida pelo usurio, deve usar a anotao @SequenceGenerator definindo um nome para a sequencia e qual o nome dela na base de dados: @SequenceGenerator(name = "SEQ_CLIENTE", sequenceName = "cliente_seq") @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "SEQ_CLIENTE")
Recuperao de dados
Formas de recuperar objetos
Pelo identificador Usando HQL Usando a API Criteria Usando SQL nativo
HQL
Hibernate Query Language
No uma linguagem de manipulao de dados (como SQL); no serve para inserir, remover, atualizar; usada apenas para recuperao de objetos O query mais simples possvel:
Query q1 = session.createQuery("from Universidade"); List result = q1.list();
Consultas HQL
O query mais simples possvel:
Query q1 = session.createQuery("from Universidade"); List result = q1.list();
Os resultados de um query podem ser lidos em pginas O query abaixo l 10 pginas, a partir da primeira pgina:
Query query = session.createQuery("from Centro c order by c.nome asc"); query.setFirstResult(0); query.setMaxResults(10); List results = query.list();
Por ordem
String queryString = "from Centro centro where + centro.nome like ?"; Query q = session.createQuery(queryString); q.setString(0, %L%); List result = q1.list();