Sei sulla pagina 1di 152

Persistncia Objeto/Relacional com Hibernate Annotations

Prof. Alan Bruch

Persistncia
Define como guardar os dados em um banco de dados. Todo sistema persistente? Como realizada atualmente?

Mapeamento Objeto Relacional(MOR)


MOR a persistncia automatizada dos objetos em uma aplicao Java para as tabelas em um banco de dados relacional. Trabalha com a transformao(reversvel) dos dados de uma representao para outra. As tabelas do banco de dados so representadas atravs de classes e os registros de cada tabela so representados como instncias das classes correspondentes. Com esta tcnica, o programador no precisa de se preocupar com os comandos em linguagem SQL; ir usar uma interface de programao simples que faz todo o trabalho de persistncia.

Mapeamento de um objeto com tipos primitivos


Mapeamento simples: objeto possui apenas tipos de dados bsicos.

Mapeamento de objetos que contm uma coleo de objetos


Um objeto possui um conjunto de outros objetos.

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

Configurando Conexo NetBeans

Configurando Conexo NetBeans

Configurando Conexo NetBeans

Configurando Conexo NetBeans

Configurando Conexo NetBeans

Configurando Conexo NetBeans

Configurando Conexo Hibernate

Configurando Conexo Hibernate

Configurando Conexo Hibernate

Configurando Conexo Hibernate

Configurando Conexo Hibernate

Configurando Conexo Hibernate

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.

Exemplo de um POJO ou BEAN


public class Pessoa { private int idPessoa; private String nome; public Pessoa(){ } public int getIdPessoa() { return idPessoa; } private void setIdPessoa(int idPessoa) { this.idPessoa = idPessoa; } public String getNome(){ return nome; } public void setNome(String nome) { this.nome = nome; }

Exemplo de um POJO ou BEAN

Exemplo de um POJO ou BEAN

Exemplo de um POJO ou BEAN

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.

Interfaces Criteria e Query


Utilizadas para realizar consultas ao banco de dados.

Abrindo uma sesso...


SessionFactory sessionFactory = new AnnotationConfiguration(). configure("hibernate.cfg.xml). buildSessionFactory(); Session session = sessionFactory.openSession();

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();

Persistindo Objeto Classe AppPessoa.java

Persistindo Objeto Classe AppPessoa.java

Persistindo Objeto Classe AppPessoa.java

Consultando um Objeto Classe AppPessoa.java


Para recuperar um objeto da base de dados, preciso saber o valor do seu ID. O atributo que o identifica definido na classe Bean. Para consultar, executamos o seguinte cdigo: session.get(Classe, Valor ID); Onde, a Classe corresponde a classe que queremos recuperar o valor do ID informado.

Exemplo:
session.get(Pessoa.class, 1);

Consultando um Objeto Classe AppPessoa.java


Um objeto precisa receber o resultado da consulta, ento antes de executar a consulta, instanciamos um objeto que ir receber o resultado. Exemplo:
Pessoa pessoa = new Pessoa(); pessoa = (Pessoa)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());

Consultando um Objeto Classe AppPessoa.java

Alterando um Objeto Classe AppPessoa.java


Para alterar um objeto, primeiro precisamos recuper-lo, como explicado anteriormente. Para fazer isso, precisamos saber qual o valor do ID desse objeto. Aps recuperado o objeto, passamos os novos valores para os atributos que desejamos alterar:
pessoa.setNome(Marciano);

E aplicamos a correo com o comando:


session.saveOrUpdate(pessoa);

Alterando um Objeto Classe AppPessoa.java


Para salvar, tambm preciso abrir a transao, e aps ter executado o comando saveOrUpdate, deve ser feito o commit:
Transaction t = session.beginTransaction(); session.saveOrUpdate(pessoa); t.commit(); session.close();

Alterando um Objeto Classe AppPessoa.java

Removendo um Objeto Classe AppPessoa.java


Para remover um objeto, primeiro precisamos recuper-lo. Para fazer isso, precisamos saber qual o valor do ID desse objeto. Aps recuperado o objeto, basta removlo:
session.delete(pessoa);

Alterando um Objeto Classe AppPessoa.java


Para salvar, tambm preciso abrir a transao, e aps ter executado o comando delete, deve ser feito o commit:
Transaction t = session.beginTransaction(); session.delete(pessoa); t.commit(); session.close();

Alterando um Objeto Classe AppPessoa.java

Consultando todos Objetos Classe AppPessoa.java


Comando para retornar todos os objetos de uma classe:
session.createCriteria(Classe).list();

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();

Consultando todos Objetos Classe AppPessoa.java


Para percorrer todos os objetos retornados na lista faremos:
for (Pessoa pessoa : lista) { JOptionPane.showMessageDialog(null, pessoa.getNome()); }

Consultando todos Objetos Classe AppPessoa.java


Para percorrer todos os objetos retornados na lista faremos:
for (Pessoa pessoa : lista) { JOptionPane.showMessageDialog(null, pessoa.getNome()); }

Consultando todos Objetos Classe AppPessoa.java

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.

Pacote Util: classe HibernateUtil.java


import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; public class HibernateUtil { private static SessionFactory SESSIONFACTORY; static{ AnnotationConfiguration cfg = new AnnotationConfiguration(); SESSIONFACTORY = cfg.buildSessionFactory(); } public static Session getSession(){ return SESSIONFACTORY.openSession(); }

Pacote Util: classe HibernateUtil.java

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(); } }

Modificao na classe DaoFactory


Para cada classe DAO criada, dever ser criado um mtodo na classe DaoFactory que retorne uma instncia da classe DAO: public PessoaDao getPessoaDao(){ return new PessoaDao(session); }

Modificao na classe DaoFactory

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

Associaes 1-n (one-to-many) Classe Cidade.java


Classe Cidade
Incluir atributo chamado collPessoas do tipo Collection<Pessoa> e utilizar a anotao OneToMany:
@OneToMany(mappedBy=cidade") private Collection<Pessoas> collPessoas;

Gerar os mtodos getters e setters.

Associaes 1-n (one-to-many) Classe Cidade.java

Associaes n-1 (many-to-one) Classe Pessoa.java


Classe Pessoa
Incluir o atributo chamado cidade do tipo Cidade com as anotaes:
@ManyToOne @JoinColumn(name="idcidade") private Cidade cidade;

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 n-1 (many-to-one) Classe Pessoa.java

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.

Associaes n-n (many-to-many)


Um relacionamento n-n implica em existir uma nova tabela para mapear o relacionamento no banco de dados. Relacionamento n-n entre Curso e Departamento:

Associaes n-n (many-to-many)


Criar uma nova tabela chamada departamento_curso.

Associaes n-n (many-to-many)


Em cada classe persistente, anotar o atributo que faz referencia a outra classe:
@ManyToMany @JoinTable

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;

Associaes n-n (many-to-many)


Classe Departamento:
Atributo cursos: @ManyToMany(fetch=FetchType.LAZY) @JoinTable(name="departamento_curso", joinColumns=@JoinColumn(name="id_departamento"), inverseJoinColumns=@JoinColumn(name="id_curso")) private Collection<Curso> cursos;

Associaes n-n (many-to-many)


Classe Curso:
Atributo departamentos: @ManyToMany(fetch=FetchType.LAZY) @JoinTable(name="departamento_curso", joinColumns=@JoinColumn(name="id_curso), inverseJoinColumns=@JoinColumn(name="id_departamento)) private Collection<Departamento> departamentos;

Associaes n-n (many-to-many)


Exerccio:
Criar as classes persistentes para um sistema onde possui as classes disciplinas e professores, onde um professor pode ministrar vrias disciplinas e uma disciplina pode ser ministrada por vrios professores.

Persistindo dados utilizando as classes controladoras


Na classe view, criar uma varivel de classe referente a classe controladora que se deseja utilizar. Por exemplo, na classe PessoaView, criar a seguinte varivel de classe:
PessoaControler pessoaControler = new PessoaControler();

Persistindo dados utilizando as classes controladoras


Criar dois mtodos na classe:
getDadosTela() setDadosTela(Pessoa pessoa)

O primeiro passa os dados da tela para um bean. O segundo passa os dados do bean para os componentes da tela.

Persistindo dados utilizando as classes controladoras


private Pessoa getDadosTela() { Pessoa p = new Pessoa(); if (MyNumber.parseInt(jTfCodigo.getValue()) > 0){ p.setIdPessoa (MyNumber.parseInt(jTfCodigo.getValue())); } p.setNome(jTfNome.getText()); return p; }

Persistindo dados utilizando as classes controladoras


private void setDadosTela(Pessoa p){ if (p.getIdPessoa() > 0){ jTfCodigo.setValue(p.getIdPessoa()); } jTfNome.setText(p.getNome()); }

Persistindo dados utilizando as classes controladoras

Persistindo dados utilizando as classes controladoras


Criar mais 5 mtodos:
salvar(); remover(); consultar(); cancelar(); fechar();

Persistindo dados utilizando as classes controladoras


private void salvar(){ Pessoa p = getDadosTela(); pessoaControler.salvar(p); }

Persistindo dados utilizando as classes controladoras


private void remover() { int id = MyNumber.parseInt(jTfCodigo.getValue()); if (id > 0) { Pessoa p = pessoaControler.buscar(id); pessoaControler.remover(p); } }

Persistindo dados utilizando as classes controladoras


private void cancelar(){ jTfCodigo.setValue(0); jTfNome.setText(); }

Persistindo dados utilizando as classes controladoras


private void consultar(){ //este mtodo ir abrir uma tela de consulta que //ira retornar um objeto do tipo pessoa. }

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

private void selecionar(){ Integer id = (Integer)model.getValueAt(jTblDados.getSelectedRow(), 0); pessoa = pessoaControler.buscar(id); }


public Pessoa getPessoa() { return pessoa; }

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.

Persistindo dados utilizando as classes controladoras


Classe PessoaDao:
Adicionar a consulta que consulta por nome, incluindo o seguinte mtodo: public List<Pessoa> buscarPorNome(String nome){ Query q = session.createQuery("from Pessoa p where p.nome like ?"); q.setString(0, "%"+nome+"%"); return q.list(); }

Persistindo dados utilizando as classes controladoras

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

Ajustando Interface de Cadastro


Chamar o mtodo salvar(); no boto salvar Chamar o mtodo remover(); no boto apagar Chamar o mtodo consultar(); no boto consultar Chamar o mtodo cancelar(); no boto cancelar Colocar o cdigo dispose(); no boto fechar

JComboBox com Dados do Banco


Adicionar:
JLabel, mudar texto para Cidade: JComboBox, renomear para jCmbCidade

JComboBox com Dados do Banco


Tirar os dados da propriedade Model do JComboBox Criar o mtodo carregaCidade():
private void carregaCidade(){ CidadeControler cidadeControler = new CidadeControler(); List<Cidade> list = cidadeControler.buscarTodos(); jCmbCidade.removeAllItems(); for (Cidade cidade : list) { jCmbCidade.addItem(cidade); } }

JComboBox com Dados do Banco

JComboBox com Dados do Banco


No bean Cidade.java incluir os seguintes mtodos:
@Override public String toString() { return nome; } @Override public boolean equals(Object obj) { if (obj instanceof Cidade) return this.getIdCidade() == ((Cidade)obj).getIdCidade(); else return super.equals(obj); }

JComboBox com Dados do Banco


Acrescentar no mtodo setDadosTela:
jCmbCidade.setSelectedItem(p.getCidade());
Acrescentar no mtodo getDadosTela:

p.setCidade((Cidade)jCmbCidade.getSelectedItem());

Estratgia para Atribuir Valor para a Chave Primria


O valor atribudo chave primria pode ser dado tanto pela aplicao quanto por um mecanismo do Hibernate que o gere automaticamente. A anotao @GeneratedValue permite a definio automtica para o valor do identificador. O Hibernate apresenta vrios mecanismos internos para a gerao dos valores da chave primria.
Sequence: Mapeado em seqncias no DB2, PostgreSQL, Oracle, Firebird; Auto: Utiliza uma sequence comum chamada hibernate_sequence. Identity: Utiliza Colunas de Identidades. Suportado nos bancos de dados DB2, MySQL, MS SQL Server, Sybase e HypersonicSQL Table: O usurio define uma tabela que armazenar os valores das sequences.

Estratgia para Atribuir Valor para a Chave Primria


Para definir a estratgia, deve ser passado por parmetro qual a escolhida:
I. @GeneratedValue(strategy II. @GeneratedValue(strategy III.@GeneratedValue(strategy IV. @GeneratedValue(strategy = = = = GenerationType.SEQUENCE). GenerationType.IDENTITY). GenerationType.AUTO). GenerationType.TABLE).

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();

Consultas HQL - Parmetros


Parmetros podem ser passados duas formas: Por nome de varivel
String queryString = "from Centro centro where + centro.nome like :nomeBusca"; Query q = session.createQuery(queryString); q.setString ("nomeBusca", "%L%"); List result = q1.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();

Consultas HQL Queries Chamadas pelo Nome


Queries no precisam aparecer no cdigo. Especifica o query no bean:
@Entity @NamedQuery(name=centro.findNome", query="from Centro where nome like :nomeBusca")

Para chamar um query pelo nome:


Query q = session.getNamedQuery(centro.findNome");

Mais de uma consulta no bean:


@NamedQueries({ @NamedQuery(name = "centro.findNome", query = "from Centro where nome like :nomeBusca"), @NamedQuery(name = "centro.todos", query = "from Centro") })

Consultas HQL Joins


Joins (junes) so usados para combinar dados de duas ou mais tabelas relacionadas Joins em HQL so bem mais simples que em SQL Exemplo: from Universidade un inner join un.centro Retorna um array de Object; Incluir fecth para retornar as colees inicializadas.

Consultas HQL Select


Com SELECT possvel especificar quais os atributos retornados do objeto Retorna um array de object;
Query query = session.createQuery(select un.nome, cen.nome from Universidade un inner join un.centro cen "); Iterator i = q.list().iterator(); while (i.hasNext()) { Object[] row = (Object[]) i.next(); String nomeUn = (String) row[0]; String nomeCen = (String) row[1]; System.out.println(nomeUn + " ---- " + nomeCen); }

Consultas HQL Funes Agregadas


HQL suporta as seguintes funes na clusula select:
count(), min(), max() retorna Long sum() Tipo definido para o atributo avg() retorna Double Long count = (Long)session.createQuery("select count(*) from Centro").uniqueResult();
Object[] avgmax = (Object[]) session.createQuery("select avg(c.idCentro), max(c.idCentro) from Centro c").uniqueResult(); Double avg = (Double)avgmax[0]; Long max = (Long)avgmax[1];

Potrebbero piacerti anche