Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Hibernate Annotations
• Hibernate Core
• Hibernate Annotations
• Hibernate EntityManager
• www.hibernate.org
Configurando Conexão NetBeans
Configurando Conexão NetBeans
Configurando Conexão NetBeans
Configurando Conexão NetBeans
Configurando Conexão NetBeans
Configurando Conexão NetBeans
Configurando Conexão Hibernate
Configurando Conexão Hibernate
Configurando Conexão Hibernate
Configurando Conexão Hibernate
Configurando Conexão Hibernate
Configurando Conexão Hibernate
Classes Persistentes
• Considerações:
– O Hibernate requer que toda classe
persistente possua um construtor padrão
sem argumentos.
– O Hibernate persiste as propriedades no
estilo JavaBeans utilizando os métodos
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
• Session (org.hibernate.Session)
– Possibilita a comunicação entre a aplicação e
a persistência, através de uma conexão
JDBC.
– É um objeto leve de ser criado.
– Com ele é possível criar, remover, atualizar e
recuperar objetos persistentes.
• SessionFactory
(org.hibernate.SessionFactory)
– Mantém o mapeamento objeto relacional em
memória.
– É um objeto pesado de ser criado.
– Permite a criação de objetos Session.
Hibernate - Arquitetura
• Configuration
(org.hibernate.Configuration)
– Utilizado para realizar as configurações de
inicialização do Hibernate:
• Driver do banco de dados.
• Usuário e senha do banco.
• Transaction (org.hibernate.Transaction)
– Utilizada para representar uma unidade
indivisível de uma operação de manipulação
de dados.
• Interfaces Criteria e Query
– Utilizadas para realizar consultas ao banco
de dados.
Abrindo uma sessão...
• SessionFactory sessionFactory =
new AnnotationConfiguration().
configure("hibernate.cfg.xml“).
buildSessionFactory();
• Session session = sessionFactory.openSession();
Persistindo Objeto
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.
• Após recuperado o objeto, basta removê-
lo:
– session.delete(pessoa);
Alterando um Objeto
Classe AppPessoa.java
• Para salvar, também é preciso abrir a
transação, e após 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 método retorna uma lista, então
faremos com que o resultado seja
atribuído 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:
• Salvar ou Atualizar:
– session.saveOrUpdate(objeto);
• Remover:
– session.delete(objeto);
• Busca:
– session.get(Classe, Valor ID);
• Busca todos:
– session.createCriteria(Classe).list();
Hibernate Annotations
• Anotação @Temporal:
– TemporalType.DATE: usado para
mapear datas;
– TemporalType.TIME: usado para
mapear hora;
– TemporalType.TIMESTAMP: usado
para mapear datas e hora.
Hibernate Annotations
• 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 não é permitido no
padrão MVC.
Organizando a aplicação
• No padrão MVC:
– A View acessa solicita ao controler que
manipule os dados(inserir, alterar, remover,
consultar)
– O Controler por sua vez faz as modificações
solicitadas através das classes DAOs da
camada Model.
Organizando a aplicação
import br.com.faculdadeiguacu.tesi.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
public DaoFactory() {
this.session = HibernateUtil.getSession();
}
import br.com.faculdadeiguacu.tesi.model.bean.Pessoa;
import java.util.List;
import org.hibernate.Session;
public PessoaControler() {
daoFactory = new DaoFactory();
pessoaDao = daoFactory.getPessoaDao();
}
@OneToMany(mappedBy=“cidade")
private Collection<Pessoas> collPessoas;
• Anotação Cascade:
– Serve para indicar com que ação em cascata o
relacionamento será tratado.
– Incluir a anotação @Cascade(CascadeType.ALL)
no atributo da classe Professor onde há
associação.
– Imports:
• import org.hibernate.annotations.Cascade;
• import org.hibernate.annotations.CascadeType;
Associações
• Atributo fetch:
– Indica quando o conteúdo do atributo anotado
será trazido da base de dados.
– Valores:
• FetchType.EAGER
• FetchType.LAZY
– Exemplo:
• @OneToMany(mappedBy=“professor", fetch =
FetchType.LAZY)
Exercício
• 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;
Associações 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;
Associações n-n (many-to-many)
• Exercício:
– Criar as classes persistentes para um sistema onde possui as
classes disciplinas e professores, onde um professor pode
ministrar várias disciplinas e uma disciplina pode ser
ministrada por vários professores.
Persistindo dados utilizando as
classes controladoras
• Na classe view, criar uma variável de classe referente a
classe controladora que se deseja utilizar.
• Por exemplo, na classe PessoaView, criar a seguinte
variável de classe:
PessoaControler pessoaControler = new PessoaControler();
Persistindo dados utilizando as
classes controladoras
• Criar dois métodos na classe:
– getDadosTela()
– setDadosTela(Pessoa pessoa)
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
• Classe PessoaControler:
– Adicionar um método que chama a consulta criada na
classe PessoaDao:
• Classe ConsultarPessoaView:
Interface de Consulta
• Adicionar:
– JLabel, mudar texto para Cidade:
– JComboBox, renomear para jCmbCidade
JComboBox com Dados do Banco
@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
– 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 não precisam aparecer no código.
• Especifica o query no bean:
@Entity
@NamedQuery(name=“centro.findNome", query="from Centro
where nome like :nomeBusca")
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 – Funções
Agregadas
• HQL suporta as seguintes funções na cláusula
select:
– count(), min(), max() – retorna Long
– sum() – Tipo definido para o atributo
– avg() – retorna Double