Sei sulla pagina 1di 8

"Feliz aquele que transfere o que sabe e aprende o que ensina!

" Cora Coralina


Java sem caf.!
Incio Nvel: Iniciante Nvel: Intermedirio Nvel: Avanado
Pesquisar
17 de maro de 2011
JPA 2.0: CRUD com EJB 3.1
Segundo a Oracle:
"Enterprise JavaBeans (EJB) technology is the server-side component architecture for Java Platform,
Enterprise Edition (Java EE). EJB technology enables rapid and simplified development of distributed,
transactional, secure and portable applications based on Java technology."
Nessa postagem vamos criar um CRUD utilizando EJB como forma de injetar a conexo com o banco de dados.
Atualmente est na verso 3.1, para ser utilizada com JEE 6. Eu j usei o EJB 3.0 com o JEE 5, e aquele era um
"monstrinho" de pesado! Hoje nem chega ser perceptvel o uso dele.
Bom... chega de teorias e vamos ao o que interessa, crie um projeto com o nome CrudJPA, caso no saiba como iniciar o
JPA no projeto, use esse projeto como base (siga os passos at criar o persistence.xml).
Em Pacotes de cdigo-fonte crie os pacotes: model, controle e dao. Dentro do pacote model crie uma classe java com o
nome de Cliente.java:
Nosso modelo acima no tem nada de diferente, apenas as anotaes do JPA que j foram faladas em postagens
anteriores, antes que esqueamos vamos mapear nossa entidade Cliente, dentro do persistence.xml, o mesmo dever
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="cliente")
public class Cliente implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="codigo")
private Long codigo;

@Column(length=100, name="nome")
private String nome;

public Long getCodigo() {
return codigo;
}

public void setCodigo(Long codigo) {
this.codigo = codigo;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

@Override
public int hashCode() {
int hash = 0;
hash += (codigo != null ? codigo.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
if (!(object instanceof Cliente)) {
return false;
}
Cliente other = (Cliente) object;
if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
return false;
}
return true;
}
}
Newsletter
Email address... Submit
Desde 08/2010
5 3 6 8 0 8
2010 (18)
2011 (35)
Janeiro 2011 (3)
Fevereiro 2011 (3)
Maro 2011 (8)
JavaEE 6: Bean
Validation 1.0
JPA 2.0: Criando
tabelas - Parte
2
JSF 2.0:
Utilizao de
Facelets
JPA 2.0: CRUD
com EJB 3.1
JPA 2.0: Criando
tabelas - Parte
3
JSF 2.0:
Componentes
bsicos
JPA 2.0: Gerar
classes a partir
do banco com o
Net...
JSF 2.0: Ajax
nativo
Abril 2011 (2)
Maio 2011 (13)
Junho 2011 (5)
Agosto 2011 (1)
Arquivos
Lomadee, uma nova espcie na web. A
maior plataforma de afiliados da Amrica
BuscaP / Bondfaro
Lomadee
0
More Next Blog
?
ficar assim:
Agora dentro do pacote dao crie uma classe java com o nome de ClienteDAO.java, com o seguinte cdigo:
Agora vamos entender o que acontece no nosso ClienteDAO:
@Stateless: essa anotao define um bean de sesso sem estado, o que isso quer dizer? Que o nosso dao ser criado
toda vez que precisarmos dele. Caso precise que esse EJB se mantenha como um escopo de sesso mesmo, a teria que
usar @Stateful... mas no vem ao caso agora.
@PersistenceContext: este usado para injetar o PU (persistence unit) em um EntityManager, veja que no necessrio
instanciar um EntityManagerFactory. Lembre-se que esse TesteJPAPU o mesmo que foi definido l no meu persistence-
unit do meu persistence.xml.
E quantos aos mtodos, perceba nos cdigos que no h mais a necessidade de abrir
(usando em.getTransaction().begin()) e nem fechar (usando em.close()) a conexo com o banco de dados, ou seja, o EJB
ser o responsvel por fazer isso (isso evita possveis exception do tipo LazyInitializationException).
Apenas uma observao para o mtodo gravar: veja que no tem o mtodo alterar, isso pois o em.merge(cliente), funciona
1
2
3
4
5
6
7
8
9
10
11
<persistence version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence
<persistence-unit name="TesteJPAPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>5tads</jta-data-source>
<class>model.Cliente</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
</persistence-unit>
</persistence>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package dao;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import model.Cliente;

/**
*
* @author andii
*/

@Stateless
public class ClienteDAO {

@PersistenceContext(unitName="TesteJPAPU")
private EntityManager em;

public boolean gravar(Cliente cliente){
boolean sucesso = false;
try {
em.merge(cliente);
sucesso = true;
} catch (Exception e) {
e.printStackTrace();
}

return sucesso;
}

public Cliente selecionar(Long codigo){
Cliente cliente = null;
try {
cliente = em.find(Cliente.class, codigo);
} catch (Exception e) {
e.printStackTrace();
}

return cliente;
}

public boolean remover(Cliente cliente){
boolean sucesso = false;
try {
cliente = em.find(Cliente.class, cliente.getCodigo());
em.remove(cliente);
sucesso = true;
} catch (Exception e) {
e.printStackTrace();
}

return sucesso;
}

public List<Cliente> listar() {
List<Cliente> clientes = null;
try {
Query query = em.createQuery("Select c from Cliente c");
clientes = query.getResultList();
} catch (Exception e) {
e.printStackTrace();
}

return clientes;
}
}
2012 (4)
2013 (1)
JSF 2.0: Template em Facelets
com Layout do PrimeFaces 3.0
JSF 2.0: Utilizao de Facelets
JSF 2.0: Componentes
PrimeFaces 2.2.1 - Parte 1
Login customizado com Spring
Security 3.1.4
JSF 2.0: Componentes
PrimeFaces 2.2.1 - Parte 3
Mais vistos na semana
Edson Gonalves
Java Anywhere
JavaRequest
krams::
Loiane Groner
Rafael Ponte
teis
Componentes CRUD
HelloWorld Jasper Reports
JavaEE JavaEE 5
JavaEE 6 JavaSE JPA
2.0 JSF1.2 JSF2.0 JSP
MySQL
PrimeFaces
Servlet
Tags
Anlise Collections
Facelets
Java
PDF PDFBox
Segurana
Spring Security Swing
TCC UML XStream
Lomadee, uma nova espcie na web. A
maior plataforma de afiliados da Amrica
?
?
tanto para persistir um objeto como apenas para alterar, isso funciona assim: caso o JPA identifique que o objeto passado
por parmetro no est sendo gerenciado por ele, isso far ele gravar um novo objeto, no caso aqui um novo cliente. J
quando voc seleciona um cliente com um em.find(...) esse cliente est sendo gerenciado pelo JPA, e se mandar dar um
em.merge(cliente) ele vai apenas alterar os dados, e no gravar um novo!
E agora vamos criar um bean dentro do pacote controle, para isso crie uma classe java com o nome de ClienteBean.java,
dessa forma:
A unica diferena nesse bean o fato do nosso ClienteDAO estar anotado com um @EJB.
@EJB: Essa anotao serve para fazermos a injeo de dependncia do nosso EJB, que neste caso o ClienteDAO, por
ele estar sendo injetado, em nenhum momento ser necessrio instncia-lo com um new ClienteDAO();
Agora para finalizar de vez o CRUD, vamos alterar a pgina index.xhtml(que criada juntamente com o projeto) e para
no ter que criar outras pginas, fiz o CRUD inteiro somente na pgina index, mas a s fazer como desejar, esta dever
ficar assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package controle;

import dao.ClienteDAO;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import model.Cliente;

/**
*
* @author andii
*/
@Named(value = "clienteBean")
@SessionScoped
public class ClienteBean implements Serializable {

@EJB
private ClienteDAO clienteDAO;
private Cliente cliente = new Cliente();
private List<Cliente> clientes;

public void novo(){
cliente = new Cliente();
}

public void gravar() {
FacesContext context = FacesContext.getCurrentInstance();
boolean resultado = clienteDAO.gravar(cliente);

if (resultado) {
cliente = new Cliente();
context.addMessage(null, new FacesMessage("Cliente gravado com sucesso"));
} else {
context.addMessage(null, new FacesMessage("Falha ao gravar cliente!"));
}
}

public void selecionar(ActionEvent evento) {
Long codigo = (Long) evento.getComponent().getAttributes().get("codigo");
cliente = clienteDAO.selecionar(codigo);
}

public void remover() {
FacesContext context = FacesContext.getCurrentInstance();
boolean resultado = clienteDAO.remover(cliente);

if (resultado) {
cliente = new Cliente();
context.addMessage(null, new FacesMessage("Cliente removido com sucesso"));
} else {
context.addMessage(null, new FacesMessage("Falha ao remover cliente!"));
}
}

//Getters e Setters
public Cliente getCliente() {
return cliente;
}

public void setCliente(Cliente cliente) {
this.cliente = cliente;
}

public List<Cliente> getClientes() {
clientes = clienteDAO.listar();
return clientes;
}

public void setClientes(List<Cliente> clientes) {
this.clientes = clientes;
}
}
1
2
3
4
5
6
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
?
?
Inicialmente essa seria a visualizao da pgina index:
Ao clicar no boto Selecionar o cliente ser selecionado, e ser renderizado um boto de remover, enfim quando
selecionado um cliente, a janela fica assim:
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form id="dadosCliente">
<fieldset style="width: 350px">
<legend>Novo cliente</legend>
<h:commandButton value="Novo" action="#{clienteBean.novo}" />
</fieldset>
<fieldset style="width: 350px">
<legend>Dados do cliente</legend>
<h:panelGrid columns="4">
<h:outputText value="Nome" />
<h:inputText value="#{clienteBean.cliente.nome}" />
<h:commandButton value="Gravar" action="#{clienteBean.gravar}" />
<h:commandButton value="Remover" action="#{clienteBean.remover}" rendered="#{clienteBean.cliente.codigo > 0}" />
</h:panelGrid>
</fieldset>
</h:form>

<h:form>
<fieldset style="width: 350px">
<legend>Clientes</legend>
<h:dataTable value="#{clienteBean.clientes}" var="cliente" border="1">
<h:column>
<f:facet name="header"><h:outputText value="CODIGO" /></f:facet>
<h:outputText value="#{cliente.codigo}" />
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="NOME" /></f:facet>
<h:outputText value="#{cliente.nome}" />
</h:column>
<h:column>
<h:commandButton value="Selecionar" actionListener="#{clienteBean.selecionar}"
<f:attribute name="codigo" value="#{cliente.codigo}" />
<f:ajax render=":dadosCliente" execute="@this" />
</h:commandButton>
</h:column>
</h:dataTable>
</fieldset>
</h:form>
</h:body>
</html>
Postado por andii.brunetta s 18:25
Marcadores: CRUD, JavaEE 6, JPA 2.0, JSF2.0
Mas como eu falei, essa apenas uma opo de como pode ser feito nossa visualizao, use sua criatividade para deix-
la como achar melhor!
Para mais informaes veja a API do Java EE 6, para ver mais sobre o EJB, selecione o pacote javax.ejb. Aqui finalizamos
mais uma postagem... fiz ela bem simples, para dar mais foco ao EJB 3.1 com o JPA 2.0. :)
Recomende isto no Google
27 comentrios:
Lo Douglas Padilha 28/03/2011 14:07:00
Parabns pelo post!
Responder
fabio 28/03/2011 15:23:00
Bacana o post, parabns, obrigado por compartilhar seu conhecimento, mas tenho uma dvida a classe
ClienteDAO no est capturando as excees causadas pelo jpa, vo fez alguma configurao no servidor pra
isso funcionar?
Responder
andii.brunetta 28/03/2011 15:28:00
Obrigada! Quanto a captura de excees do JPA, no fiz nada no, at j tentei capturar elas com try catch mas
por algum motivo desconhecido no consegui, por isso trato elas de modo geral com o Exception.
Responder
fabio 28/03/2011 16:14:00
Obrigado por responder
ento mas nem desse jeito que voc fez no est funcionando no meu servidor de Aplicao
public boolean gravar(Cliente cliente){ boolean sucesso = false;
try {
em.merge(cliente);
sucesso = true;
} catch (Exception e) { e.printStackTrace();
}
return sucesso;
}
s consigo capturar desse jeito se eu colocar um "em.flush()" depois do "em.merge()", qual servidor esta usando?
Responder
andii.brunetta 28/03/2011 16:30:00
Eu uso o GlassFish... mas que tipo de exceo estaria dando?
Responder
fabio 29/03/2011 12:47:00
no est dando nenhuma exceo, mas eu gostaria de capturar quando ocorrer, tipo o cliente tenta excluir um
registro de uma tabela que est ligado com outra tabela
Responder
andii.brunetta 29/03/2011 13:31:00
Ah sim, se eu no me engano at tentei fazer isso, mas acabei no conseguindo, talvez por falta de conhecimento
da minha parte.
Responder
pawloandre 26/04/2011 13:22:00
Excelente post! possvel encapsular as excees utilizando aspecto e gerar um arquivo de log. ;) Abrao.
Responder
go_utfpr 03/06/2011 19:00:00
Oi Andi, gosto muito do seu blog, me ajuda bastante!
Queria saber, teria alguma diferena se vc colocasse a anotao do SINGLETON, ou so agregaria, enfim, mudaria
alguma coisa neste exemplo!
Ajudinhaa, obrigada
Responder
andii.brunetta 06/06/2011 17:49:00
Ol go_utfpr! em que classe vc diz de colocar o @Singleton? Se for no DAO, seria interessante usar o @Statefull
para manter ele construdo durante a aplicao. Se for no Bean, no teria porque fazer isso, j que o
@SessionScoped j tem a funo de manter o estado do bean
Responder
Helcio.Pacheco 25/07/2011 21:35:00
Brunetta, ajude me por favor,antes que eu tenha um ataque epilptico e vomite meu crebro de tanta raiva.
Como fica esse arquivo persistence.xml quando as tabelas do banco j esto criadas? Do jeito que est "create-
tables" ele fica tentando criar tabelas que j existem.Que tipo de propriedade devemos setar?
Abraos.
Responder
andii.brunetta 26/07/2011 02:35:00
Ol Helcio, j tentou tirar essa propriedade? ou talvez usar como "update"? [lembro que o update funcionava com
o hibernate, nunca testei no eclipselink] ... alem disso aconselho fortemente que leia isso aqui:
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_fo
r_Schema_Generation
Responder
matusmts 11/08/2011 19:26:00
Excelente post, mas eu no concordo com uma coisa.
Com @SessionScoped o bean Clientebean mesmo no sendo usado/acessado ficar ativo e consumindo
recursos.
Para este seu modelo acredito que seja melhor usar o @RequestScoped, pois vc esta dando new nos atributos na
declarao.
Ou at o @ConversationScoped j que vc est usando CDI (algo parecido seria tirar o bean da sesso usando o
facesContext mas no funciona com o javax.enterprise.context.SessionScoped;).
Responder
andii.brunetta 11/08/2011 22:58:00
Ol matusmts! Com certeza que no se deve colocar o @SessionScoped em todos beans de um projeto. Em
nenhum eu afirmei que deveria usar o @SessionScoped, pois o foco da postagem o EJB e o JPA, e qualquer
escopo que utilizar a vai funcionar o que eu quis mostrar.
Respostas
Responder
Respostas
Responder
Respostas
Responder
Responder
matusmts 12/08/2011 09:56:00
Entendi andii.brunetta, concordo com vc.
que no momento estou bem enrrolado tentando entender os scopos do CDI, e o funcionamento dos EJBs.
Seu blog est otimo, j est no google-reader.
vlw :D
Responder
andii.brunetta 08/01/2012 13:30:00
Obrigada matusmts :)
Responder
TFMSPY 15/06/2012 10:57:00
Vc teria um projeto pronto de Cliente, Produto, Venda. Em JPA 2.0, com interface grfica sem ser web?
Responder
andii.brunetta 22/07/2012 22:26:00
Em Desktop no terei nada feito, mas com este exemplo
http://javasemcafe.blogspot.com.br/2011/02/jpa-20-criando-tabelas-parte-1.html vc consegue usar em
Desktop, pois o EJB apenas para Web.
Nome do dono do Blog ou da Empresa 03/07/2012 10:48:00
Muito Show cara...Valeu!
funcionou certinho, fiz com Postgresql.
Seu blog t ajundando demais...parabens!
Responder
andii.brunetta 22/07/2012 22:25:00
Que bom! Fico feliz por estar ajudando :)
John Miller 03/12/2012 13:47:00
Boa tarde, eu estou tentando adicionar um campo idade porm gera o seguinte erro: IDADE' no uma coluna na
tabela ou VTI 'ADMIN.CLIENTE' como eu fao para adicionar esta coluna?
ps: meu banco nativo do netbeans.
Responder
John Miller 03/12/2012 13:51:00
Opaa j achei como adicionar!! Obrigado!
andii.brunetta 03/12/2012 17:17:00
que bom!
John Miller 04/12/2012 15:41:00
Estava analisando seu cdigo... ainda sou meio iniciante, tudo funcionou normal, o CRUD funciona perfeitamente,
porm no entendi para que serve aquele boto de Novo ele est chamando o construtor certo? Aqui para mim
ele no faz nada mais do que limpar os campos.
Responder
Postagem mais recente Postagem mais antiga Incio
Assinar: Postar comentrios (Atom)
Respostas
Responder
Respostas
Responder
Digite seu comentrio...
Comentar como:
Conta do Google
Publicar

Visualizar
Deixe seu comentrio... ;)
andii.brunetta 04/12/2012 17:17:00
a funo dele inicializar um novo objeto, e consequentemente limpar os campos
Projeto Nutriline 19/08/2013 13:29:00
Ol, ao visualizar a Tela dar para ver que voc est usando JSF, ento a Classe de Controle ClienteBean um
ManagedBean. voc fez o mapeamento via xml? pois no h a anotao @ManagedBean na Classe ClienteBean.
O que dar para entender que o EJB "gerencia" o modelo e persistncia da aplicao isso?
Responder
andii.brunetta 23/08/2013 12:20:00
Ol Projeto Nutrilline, nesse caso eu usei o @Named que tem a mesma funao do @ManagedBean,
porm so de pacotes diferentes. Quando eu fiz esse tutorial eu usava o @Named, pois no estava me
acertando em usar o @ManagedBean, mas pode usar o @ManagedBean que funciona da mesma
forma. Quanto ao EJB, ele gerencia a conexo com o BD, pois vc pode ver que em nenhum momento
eu abro ou fecho a conexo com o banco, ele que faz, quanto a gerenciar o modelo e a persistncia,
isso feito pelo JPA.
andii brunetta. Modelo Awesome Inc.. Imagens de modelo por borchee. Tecnologia do Blogger.

Potrebbero piacerti anche