0 valutazioniIl 0% ha trovato utile questo documento (0 voti)
184 visualizzazioni8 pagine
O documento descreve como implementar um CRUD (criar, ler, atualizar, deletar) usando JPA com EJB. Ele começa definindo um modelo Cliente com anotações JPA e mapeando-o no arquivo persistence.xml. Em seguida, cria um ClienteDAO com métodos CRUD anotado com @Stateless e injetando um EntityManager. Por fim, implementa um ClienteBean controlador com a lógica CRUD e injeta o ClienteDAO.
O documento descreve como implementar um CRUD (criar, ler, atualizar, deletar) usando JPA com EJB. Ele começa definindo um modelo Cliente com anotações JPA e mapeando-o no arquivo persistence.xml. Em seguida, cria um ClienteDAO com métodos CRUD anotado com @Stateless e injetando um EntityManager. Por fim, implementa um ClienteBean controlador com a lógica CRUD e injeta o ClienteDAO.
O documento descreve como implementar um CRUD (criar, ler, atualizar, deletar) usando JPA com EJB. Ele começa definindo um modelo Cliente com anotações JPA e mapeando-o no arquivo persistence.xml. Em seguida, cria um ClienteDAO com métodos CRUD anotado com @Stateless e injetando um EntityManager. Por fim, implementa um ClienteBean controlador com a lógica CRUD e injeta o ClienteDAO.
"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;
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;
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;
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); }
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.