Netbeans 6.1 + JSF + JPA: Fazendo um simples CRUD
Renan
Boa noite! Primeiramente gostaria novamente de agradecer o aumento de visitas ao blog. Me esforcarei para atualiza-lo mais frequentemente.
Hoje mostrarei como fazer um CRUD simples utilizando o Netbeans 6.1 (Beta) , JavaServer Faces e JPA.
Por que Netbeans 6.1 (Beta) ? Bom, um recurso interessante de se criar paginas JSF a partir de entidades automaticamente existe na versao 5.5 , deixou de existir na 6.0 e voltará na versão 6.1, que terá lancamento dia 18 de abril deste ano =)
Então farei na 6.1 Beta por não querer usar a 5.5 e nao querer esperar o lancamento da 6.1 .
Partirei da hipótese que o leitor já tenha o Netbeans 6.1 instalado com suporte a JSF e JPA. Caso tenha dúvidas de qual versão baixar, pergunte-me e terei o prazer em responde-lo.
O que é JPA ?
http://en.wikipedia.org/wiki/Java_Persistence_API
———————————————————
Farei um sisteminha de Cadastro, remoção, edição e consulta de funcionários em empresas. Vou explicando com mais detalhes a medida que for dando os passos necessários.
Primeiramente, deve-se criar um novo projeto JavaServer Faces:
File -> New Project -> Web -> Web Application
Name: Exemplo
Server: Glassfish
JavaEE Version: Java EE 5
Next -> Escolha o framework JavaServer faces e clique em Finish.
Agora vamos criar o banco de dados no qual persistiremos os dados:
Vá na aba Services -> Databases -> Clique com botao direito em JavaDB e crie um novo banco de dados:
Name: exemplo
User name: root
Password: root
Pronto, agora com o projeto e o banco criados vamos criar a unidade de persistência (persistence.xml)
botao direito sobre o projeto -> New -> Persistence Unit e faça dessa forma:
Name: ExemploPU
Persistence provider: TopLink(default)
Data Source: New Data Source…
JNDI Name: jdbc/exemplo
Database Connection: jdbc/derby://localhost:1527/exemplo (Selecione o banco criado no passo anterior)
Marque a opcao “Use Java Transaction APIs” e selecione “CREATE” como estrategia para geração das tabelas.
Com isso não nos preocuparemos em criar as tabelas manualmente. Ao fazer o deploy da aplicação as tabelas serão criadas automaticamente. Clique em Finish.
Perceba que um arquivo persistence.xml foi criado.
Agora criaremos as entidades:
botao direito no projeto -> new -> entity class:
name: Funcionario
package: model
primary key type: Long
Crie tambem uma entidade chamada Empresa da mesma foram que criou a entidade Funcionario.
——————————————–
O que é uma entidade ?
Entidade é um objeto que pode ser gravador pelo mecanismo de persistencia. Cada entidade representará uma tabela no banco de dados. Seus atributos serão as colunas. Tudo isso é definido usando anotações(annotations). Uma entidade JPA é um POJO anotado!
Vejam o código da entidade Funcionario.java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
/**
*
* @author Martins
*/
@Entity
public class Funcionario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private float salario;
private String nome;
private String cargo;
@ManyToOne
private Empresa empresa;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Funcionario)) {
return false;
}
Funcionario other = (Funcionario) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "model.Funcionario[id=" + id + "]";
}
public float getSalario() {
return salario;
}
public void setSalario(float salario) {
this.salario = salario;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public Empresa getEmpresa() {
return empresa;
}
public void setEmpresa(Empresa empresa) {
this.empresa = empresa;
}
}
Analisando o código:
A anotação @Entity define a classe Funcionario como entidade de persistencia.
A anotação @Id define o atributo id como sendo a chave primária da tabela.
Automaticamente cada atributo com seu respectivo set e get irá ser persistido no banco (será uma coluna da tabela Funcionário)
A anotação @ManyToOne define a relacao N:1 de Funcionario para Empresa. Ou seja, funcionarios podem ter UMA empresa.
———————————————————
Agora vejam a entidade Empresa.java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package model;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
/**
*
* @author Martins
*/
@Entity
public class Empresa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nome;
private String endereco;
@OneToMany(mappedBy="empresa")
private Collection funcionarios;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Empresa)) {
return false;
}
Empresa other = (Empresa) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "model.Empresa[id=" + id + "]";
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public Collection getFuncionarios() {
return funcionarios;
}
public void setFuncionarios(Collection funcionarios) {
this.funcionarios = funcionarios;
}
}
Analisando o código:
Segue o mesmo padrao da entidade Funcionario. É criado uma colecao de funcionarios e a ela é atribuida a relacao OneToMany ( 1:N ).
@OneToMany(mappedBy=”empresa”)
Vejam que deve-se especificar qual o atributo da outra entidade faz referencia a esse relacionamento.
———————————————————
Pronto, temos nossas entidades prontas! Agora usaremos o recurso do Netbeans 6.1 citado no inicio do tutorial. Criar páginas JSF a partir de Entidades.
Esse recurso cria automaticamente os controllers, converters e as paginas .jsp necessárias para um CRUD no banco de dados.
Vamos lá:
botao direito no projeto -> new -> JSF Pages from entity class (parece o scaffold do rails):
Selecione as duas entidades e clique em add…
Após isso, clique em Next.
JSF Pages Folder: /
Package: controller
Clique em finish!
Será criado para cada entidade fornecida um Controller e um Converter. Nas páginas web será criado um diretorio para cada entidade e dentro dele as .jsps (new.jsp, edit,jsp, list.jsp, detail.jsp).
Pronto, agora Selecione o projeto e clique em Run.
Tchanan! Acabamos de criar um CRUD.
———————————————————
O exemplo mostrado neste tutorial foi muito simples, apenas para dar noção ao leitor de como usar os recursos do Netbeans para se trabalhar com JPA. Realmente está ficando muito prático!
Obrigado àqueles que leram todo o tutorial!
Estou aberto a críticas, sugestões e caso tenham dúvidas, não exitem em perguntar.
Renan Martins
Posted in Dicas |
19 Comments »


