Para se criar um Botão de Menu, usa-se o componente <p:menuButton>. Dentro, coloca-se componentes do tipo <p:menuitem> para as opções clicáveis. A tabela 6.16 mostra alguns atributos do Botão de Menu.
Atributo Descrição Tabela 6.15 Atributos de MenuBar. Figura 6.18 Exemplo de MenuBar.
JA VA – F ra m ew or ks e A pl ic aç õe s Co rp or at iv as
O codigo a seguir traz como exemplo a construção de um Botão de Menu com três itens, sendo que a figura 6.19 exibe o resultado da renderização desse código.
<p:menuButton value=”Options”>
<p:menuitem value=”Save” url=”/home.jsf” /> <p:menuitem value=”Update” url=”/home.jsf” /> <p:menuitem value=”Go Home” url=”/home.jsf” /> </p:menuButton> Options Save Update Go Home
Growl – <p:growl>
O componente <p:growl> é usado para apresentar mensagens em formato de notificações. As mensagens mostradas são as produzidas por FacesMessage e, portanto, funcionam como o <h:messages>.
Podemos também direcionar as mensagens como neste exemplo:
<p:messages for=“mensagens1” /> <p:growl for=“mensagens2” />
E no ManagedBean podemos usar:
FacesContext context =
FacesContext.getCurrentInstance(); context.addMessage(“mensagens1”, facesMessage1); context.addMessage(“mensagens1”, facesMessage2); context.addMessage(“mensagens2”, facesMessage3);
Nesse exemplo, facesMessage1 e facesMessage2 serão apresentados no <p:messages> e facesMessage3 no <p:growl>.
A figura 6.20 mostra como Growl é apresentado.
Teste de Mensagem Teste de Mensagem Figura 6.19 Exemplo de Botão de Menu. Figura 6.20 Exemplo de Growl.
e
7
Hibernate
Conhecer o Hibernate como ferramenta de mapeamento Objeto/Relacional em Java com JSF.
Mapeamento Objeto/Relacional; Ciclo de Vida de Persistência; Unidade de Trabalho; Contexto de Persistência; Estados, atributos transientes e interfaces do Hibernate.
Introdução
Hibernate é uma ferramenta de Mapeamento Objeto/Relacional em Java, isto é, transforma dados das tabelas em um grafo de objetos.
q
1 Ferramenta de Mapeamento Objeto/Relacional em Java; 1 Transforma dados das tabelas em um grafo de objetos; 1 Mascara o acesso ao banco, facilitando a interface com ele; 1 Aumenta a velocidade de desenvolvimento;
1 Mascara o uso de SQL;
1 Indicado para aplicações com uma modelagem rica de Objetos.
Um de seus principais objetivos é mascarar o acesso ao banco, facilitando a interface com ele, aumentando a velocidade de desenvolvimento, evitando o uso de SQL. Por suas caracte- rísticas e funcionalidades, é fortemente indicado para aplicações com uma modelagem rica de Objetos.
q
Basicamente o que se quer é transformar:
1 Um registro de uma tabela no banco de dados em Objeto do sistema; ou 1 Objetos do sistema em registros no BD.
Em geral, se pensa em:
obj
et
ivo
s
co
nc
ei
to
s
JA VA – F ra m ew or ks e A pl ic aç õe s Co rp or at iv as
q
Problemas podem ocorrer: 1 Herança;
1 Objetos com coleção de outros objetos. 1 Etc.
A figura 7.1 mostra uma correspondência simples. Veiculo
- String modelo - “Gol”; - String cor - ¨Preto”; - int ano - 2002;
Veiculo
- String modelo - “Uno”; - String cor - ¨Branco”; - int ano - 2005;
Veiculo
- String modelo - “Pálio”; - String cor - ¨vermelho”; - int ano - 2006; Modelo Cor tb_veiculo Ano Gol Preto 2002 Uno Branco 2005 Pálio Vermelho 2006
q
Para usar o Hibernate, precisa-se: 1 Banco de Dados.
2 Tabelas criadas.
1 Arquivo de configuração: hibernate.cfg.xml.
2 Contém referência para todas as classes persistentes. 1 Hibernate Session Factory.
2 Uma classe utilitária que retorna uma sessão para usar o hibernate. 1 Classes Persistentes.
2 Classes que serão mapeadas para tabelas.
Os passos para criação de um projeto Hibernate no Netbeans estão a seguir, adicionando esse Framework na criação do projeto, juntamente com a adição do Framework JSF.
q
1. Criar o Projeto, adicionando o framework Hibernate; 2. Criar HibernateUtil.java;
3. Criar Classe Persistente; 4. Criar Arquivo de Configuração; 5. Classe de Teste (Programa Principal).
Exercício de Fixação e
Acompanhar o passo a passo apresentado em sala de aula para criar um primeiro projeto utilizando o Hibernate no Netbeans. O código a seguir será utilizado no exercício e traz um exemplo de classe persistente e uma classe principal, sem usar ainda o JSF.
Os códigos a seguir apresentam um exemplo de classe persistente e um exemplo de classe
Figura 7.1
Exemplo de Correspondência Objeto-Relacional.
e package model; import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; @Entity @Table(name=”tb_teste”) @SequenceGenerator(name=”sequencia”, sequenceName=”seq_id”) public class Pessoa {
private Long id; private String nome; public Pessoa() { }
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”sequencia”) public Long getId() {
return this.id; }
public void setId(Long id) { this.id = id;
}
public String getNome() { return this.nome; }
public void setNome(String nome) { this.nome = nome; } } import org.hibernate.Session; import model.Pessoa; import util.HibernateUtil; public class Teste {
public static void main(String[] args) { Pessoa p = new Pessoa();
p.setNome(“João”);
Session session = HibernateUtil.
getSessionFactory(). openSession();
JA VA – F ra m ew or ks e A pl ic aç õe s Co rp or at iv as
Classe persistente
Uma classe persistente deve ser anotada para que seja devidamente utilizada pelo Hibernate.
q
As principais anotações são: 1 @Entity: indica que é persistente;
1 @Id: indica que uma propriedade é Primary Key; 1 @Table: indica a tabela correspondente;
1 @SequenceGenerator/@GeneratedValue: indicam atributos autoincrementáveis. Serão vistos em seção específica no decorrer do material.
O código a seguir implementa a classe persistente Aluno.java.
@Entity
@Table (name=”tb_aluno”)
@SequenceGenerator(name=”sequencia”, sequenceName=”seq_id”) public class Aluno {
private Long id; private String nome; public Aluno() { }
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”sequencia”) public Long getId() {
return id; }
public void setId(Long id) { this.id = id; }
public String getNome() { return this.nome; }
public void setNome(String nome) { this.nome = nome;
} }
Essa classe pode estar relacionada à seguinte tabela, definida pelo seu DDL:
CREATE TABLE tb_aluno (
id integer NOT NULL, nome character varying(30), CONSTRAINT pk_id PRIMARY KEY (id)
)
CREATE SEQUENCE seq_id INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807 START 10
e
Acesso simples ao banco de dados: inserção e consulta
Para se fazer uma inserção em uma base de dados usando hibernate, deve-se seguir uma sequência simples de passos:
q
1. Cria-se um objeto (se não existir) de uma classe persistente; 2. Obtém-se a sessão hibernate corrente, ou abre-se uma nova; 3. Cria-se uma transação;
4. Salva-se o objeto;
5. Efetiva-se a transação (commit); 6. Fecha-se a sessão.
O código a seguir mostra os passos para inserção.
// Criação do objeto Aluno aluno = new Aluno(); aluno.setNome(nomeAluno);
// Obter sessão hibernate corrente
Session session = HibernateUtil.getSessionFactory() .openSession(); // Inicialização da transação session.beginTransaction(); // Salvamento do Objeto session.save(aluno); // Efetivação da transação session.getTransaction().commit(); session.close();
Para se fazer uma consulta, seguimos os seguintes passos:
q
1. Obtém-se a sessão hibernate corrente ou abre-se uma nova; 2. Cria-se uma transação;
3. Consulta-se a base via HQL ou Criteria; 4. Efetiva-se a transação (commit); 5. Fecha-se a sessão.
O código a seguir apresenta um exemplo de consulta.
// Obtem-se sessão corrente do hibernate
Session session = HibernateUtil.getSessionFactory() .openSession(); // Inicia-se a transação
session.beginTransaction();
// Efetua-se a consulta (aqui em HQL)
JA VA – F ra m ew or ks e A pl ic aç õe s Co rp or at iv as
Managed Bean e XHTMLs
Dependendo da arquitetura escolhida para o desenvolvimento do sistema, o acesso às classes anotadas pode ser feito de várias formas. Nesse material será mostrada a maneira mais simples, onde o Managed Bean possui um atributo do tipo da classe persistente e, em métodos específicos para acesso ao banco, essa classe é persistida ou recuperada, usando-se a API do Hibernate.
A seguir, é apresentado o Managed Bean AlunoMB, que gerencia os dados das telas.
@Named(value = “alunoMB”) @RequestScoped
public class AlunoMB { private Aluno aluno;
private List<Aluno> listaAlunos; public AlunoMB() {
}
@PostConstruct public void init() {
this.aluno = new Aluno(); }
Nesse MB, o método salvar() usa a API do Hibernate para salvar a classe persistente aluno que já está preenchida no MB.
public String salvar() {
// salva o aluno
Session session = HibernateUtil.getSessionFactory()
.openSession(); session.beginTransaction(); session.save(this.aluno); session.getTransaction().commit(); session.beginTransaction(); // lista todos os alunos
Query query = session.createQuery(“from Aluno”); this.listaAlunos = query.list(); session.getTransaction().commit(); session.close(); return “listar”; }
O método listar() busca todos os alunos da base e preenche a lista Alunos para ser mostrada no XHTML e redireciona para listar.xhtml.
e public String listar() {
Session session = HibernateUtil.getSessionFactory()
.openSession(); session.beginTransaction();
// lista todos os alunos
Query query = session.createQuery(“from Aluno”); this.listaAlunos = query.list(); session.getTransaction().commit(); session.close(); return “listar”; } // setters/getters public Aluno getAluno() { return aluno; }
public void setAluno(Aluno aluno) { this.aluno = aluno; }
public List<Aluno> getListaAlunos() { return listaAlunos; }
public void setAluno(List<Aluno> listaAlunos) { this.listaAlunos = listaAlunos; }
}
O indexemplo:xhtml é um formulário com dois botões. Quando o botão “Salvar” é pressionado, o método salvar() é invocado. Quando o botão “Listar” é pressionado, o método listar() é invocado. A seguir, o arquivo indexemplo:xhtml.
<h:body> <h:form>
Nome: <h:inputText value=”#{alunoMB.aluno.nome}” /> <h:commandButton action=”#{alunoMB.salvar()}” value=”Salvar” /> <h:commandButton action=”#{alunoMB.listar()}” value=”Listar” /> </h:form> </h:body>
A seguir o arquivo listar.xhtml, que apresenta todos os dados retornados pelo método listar().
JA VA – F ra m ew or ks e A pl ic aç õe s Co rp or at iv as <h:outputText value=”ID” /> </f:facet> #{a.id} </h:column> <h:column> <f:facet name=”header” > <h:outputText value=”NOME” /> </f:facet> #{a.nome} </h:column> </h:dataTable>
<h:link outcome=”index” value=”Início” /> </h:body>
Arquivo de Configuração: hibernate.cfg.xml
O arquivo hibernate.cfg.xml é o arquivo que contém as configurações de acesso ao banco de dados e informações sobre as classes que são persistentes. É um arquivo XML, onde tags específicas indicam informações como: banco de dados, usuário, senha, dialeto SQL etc. A seguir, um exemplo de arquivo hibernate.cfg.xml, que configura a conexão com um banco de dados.
<?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> <property name=”hibernate.connection.driver_class”> org.postgresql.Driver </property> <property name=”hibernate.connection.url”> jdbc:postgresql://localhost:5432/curso </property> <property name=”hibernate.connection.username”>postgres</property> <property name=”hibernate.connection.password”>postgres</property> <property name=”hibernate.connection.pool_size”>1</property> <property name=”hibernate.dialect”> org.hibernate.dialect.PostgreSQLDialect </property> <property name=”hibernate.current_session_context_class”> thread </property> <property name=”hibernate.cache.provider_class”> org.hibernate.cache.NoCacheProvider
e </property> <property name=”hibernate.show_sql”>true</property> <!-- Class Mapping --> <mapping package=”com.cursojava.model”/> <mapping class=”com.cursojava.model.Aluno”/> </session-factory> </hibernate-configuration>