JPA com Hibernate + JSF + MySQL

olá Pessoal,

Neste post, vou mostrar como usar JPA para seus projetos JEE tendo como provider o nosso Hibernate e para o view usaremos JSF. Alguns adoram o TopLink da Oracle, eu tive serios problemas com ele na parte de config, e cansei de me stressar com coisas operacionais e mantenho meu querido Hibernate como provider.

Aplicação será bem simples, apenas cadastrar um cliente. Limitamos os dados do form, pois o objetivo é mostrar como criar um ambiente para development tendo JPA nos seus projetos. Já mostrei em outros posts, como criar um projeto JPA para Java Básico. Então, recebi alguns emails e para JEE?

Lets go…

Oportunidade Java:

Estamos disponibilizando uma vaga para desenvolvedor Senior Web
. Carga horária será de 8 horas diárias. Os requisitos técnicos para esta contratação são:

- Conhecimentos nas APIs: JSF, Hibernate;
- Conhecimentos nos patterns MVC, DAO, VO;
- Desejável conhecimento em RichFaces

Regime De trabalho é CLT. O salário será de 4.000 mais benefícios. 

Interessados enviar currículos para atendimento@leiria.com.br

Obrigado.

Posts relacionados

Requisitos

Iniciando

Na imagem a seguir você tem toda a estrutura do projeto, observe que já criei as bibliotecas para o projeto e estas foram adicionadas. Se não quiser adicioanr as bibliotecas ao projeto, copie os .jars para a pasta lib e pronto. Lembre-se que ao adicionar uma biblioteca ao projeto, o stupid Eclipse não copia os .jars para a pasta lib. (ao contrário do netbeans 🙂 ).

Não esqueça também de criar um schema e uma table no MySQL, aqui chamaremos de sistemas e clientes respectivamente.

estrutura

1.monte uma estrutura conforme a imagem acima.

Para os arquivos em .jsp e .xml tive que colocar no formato imagem. Infelizmente o plugin para code no wordpress, esse é estressante quando envolve xml, html etc. preciso ficar dando um espaco para cada par de < > senão ele bagunça todo código ou até converte para qualquer outra coisa. Já gastei 1 hora somente para tentar configurar isso. Em função disso, coloquei no formato img o code bem organizado. O lado bom, é que você poderá praticar sem dar ctrl + c e ctrl + v. 🙂

E como sempre boa parte das explanações estão dentro do code no formato de comentário, lado-lado para facilar a compreensão.

Desenvolvimento

2.primeiro passo é criar o bean e fazer as devidas anotações, então veja abaixo o nosso cliente bean como está:

package br.com.bean;

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")//caso o nome da tabela seja diferente informe aqui
public class Cliente {
	@Column(name="nome")
	private String nome;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	//anotação acima indica que o campo será gerado automaticamente pelo BD
	@Column(name="id")
	private int id;
	@Column(name="sobrenome")
	private String sobrenome;
	@Column(name="cidade")
	private String cidade; 

	public Cliente() {
		// TODO Auto-generated constructor stub
	}

	public String getNome() {
		return nome;
	}

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

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

}

Agora vamos partir para criar o nosso DAO, que nele teremos a nossa fábrica de conexão. E poderiamos ter métodos genéricos como salvar, deletar, atualizar etc.Mas, não vamos implementar todos.

package br.com.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DAO {

	private EntityManagerFactory emf; 

	/* se vc já está acostumado com Hibernate
	 * a ideia é a mesma do método de fabrica que
	 * criamos para os Session que vem do SessionFactory
	 * Aqui temos apenas nomeclatura diferente, pense assim.
	 */
	public EntityManager getEntityManager(){

		//responsavel pela persistencia
		return emf.createEntityManager();
	}
	public DAO() {
		//chamo ele de reprodutor da instância
		emf = Persistence.createEntityManagerFactory("sistemas");

		/* o nome passado vem do arquivo persistence.xml que contém as configs
		 * para conexão com o BD.
		 */
	}}

Agora vamos criar a classe que vai fazer a persistencia com os dados do cliente. É a ClienteDAO.java esta classe extends a classe DAO, para conseguirmos pegar um objeto objeto EntityManager que é responsável pelas inclusões, exclusões e atualizações.

package br.com.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.bean.Cliente;

public class ClienteDAO extends DAO {

	public void salvar(Cliente cliente){
		//obtendo o EntityManager
		EntityManager em = getEntityManager();
		try{
			//inicia o processo de transacao
			em.getTransaction().begin();
			//faz a persistencia
			em.persist(cliente);
			//manda bala para o BD
			em.getTransaction().commit();
		}catch (Exception e) {
			//se der algo de errado vem parar aqui, onde eh cancelado
			em.getTransaction().rollback();
		}
	}

	public List exibir(){
		EntityManager em = getEntityManager();
		try{
			Query q = em.createQuery("select object(c) from Cliente as c");

		return q.getResultList();}
		finally{
			em.close();
		}
	}
}

Agora criaremos a classe ClienteController quer terá a responsabilidade de direcionar a comunicação do JSF e pegar o foi digitado no form e persistir.

package br.com.controller;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import br.com.bean.Cliente;
import br.com.dao.ClienteDAO;
public class ClienteController {
	private Cliente cliente;
	private DataModel model;
	public ClienteController() {
		cliente = new Cliente();
	}

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

	public String salvar(){
		ClienteDAO clientedao = new ClienteDAO();
			clientedao.salvar(cliente);
		return "salvar";
	}
	public DataModel getTodos(){
			ClienteDAO clientedao = new ClienteDAO();
			model = new ListDataModel(clientedao.exibir());
		return model;
	}
}

Vamos configurar o no velho e querido face-config.xml

faceconfigdesign

Criando arquivo persistence.xml

o arquivo que vamos precisar para conectar ao banco de dados, parecido como hibernate.cfg.xml, em respeito de ter a mesma função, conectar ao BD.

Observe o name da persistence-unit pois, eh ele que usamos no nosso DAO.java

persistence

Não esqueça que terá que criar um folder META-INF em JavaSource e colocar o persistence.xml neste folder e não coloca-lo dentro do META-INF de WebContent. Alguns programadores acabam confundido e dai recebe as velhas exceções e ficam stressado. Take care easy!

Criando as pages JSF

1.Agora criamos três páginas .jsp com JSF, uma será index que redireciona para cadastro.jsf e a outra é somente uma mensagem dizendo que foi cadastrado com sucesso.

Index.jsp

Coloque o código abaixo na página index.jsp

cadastrojsf

Testando

Mande executar seu projeto. Clique nele e vá em Run ==> Run as ==> Run on Server

  • Cadastre um cliente

E depois verifique se ele está realmente no BD. Veja abaixo meus prints:

testecad

testesucessocad

testemysqlcad

Pessoal, vou ficando por aqui, espero que tenham gostado do post, o objetivo era dar o “ABC Prático” de JPA com JEE usando o framework JSF.

Abracos, see you later.! 🙂

Despedida da IBM

Olá Pessoal,

Bem, como alguns já ficaram sabendo nos bastidores, estou deixando a IBM, após quase dois anos de trabalho na companhia, e onde em 2008 escrevi este post. Quem lembra? Hoje, venho postar que não faço mais do time IBMer, os motivos nao posso mencionar aqui, pois envolve desde pessoal,profissional e informacoes confidenciais do projeto que participei.Apesar de ter  surgido oportunidades para trabalhar em outros projetos na IBM, mas por agora optei em viajar e me desligar da empresa, uma vez que não poderia fazer os dois.

Acredito que em nossa vida, vivemos fases e cada uma tem uma missão para nós. E acredito que tive uma boa fase na empresa. Aprendi muito tanto na parte técnica, mas desenvolvi bastante algumas habilidades comportamentais, sendo assim não posso dizer que sou o mesmo profissional que era à 2 anos atras.

Adotei a cultura da empresa,aprimorei meu perfil profissional, aprendi novas regras corporativas. Enfim, foi uma experiência que recomendo à todos que tiverem uma oportunidade de trabalhar nessa empresa. No meu caso que fui para um projeto internacional, meu inglês teve um avanço bem significativo em todos os skills da lingua, comparado com o tempo que venho estudando (jan/2008).Uma vez que o inglês era full time e com os nativos, então o que eu via na escola de idiomas poderia ir colocando em pratica e cada dia descobria um ponto a ser melhorado que as vezes por falta de pratica nao conseguia identificar de imediato. Enfim, Work for IBM, it was very good!!. Mas, cada um tem seu objetivo profissional e temos que ir atras deles e uma coisa que aprendi é que : “podemos mudar o caminho, mas nao desistir dos  objetivos”.

Quem lembra na época que entrei na companhia estava no finalzinho da minha graduação(bacharelado) e foi um presente que acabei ganhando foi ir para uma empresa como a IBM. Fiz amigos tanto dentro da empresa, quanto fora através dos programas que participei como Embaixador do AI/Mentorização. E acredito que esse relacionamento vai se manter, mesmo não fazendo da equipe.

Sentirei falta e saudades dos momentos stressante do trabalho, já que trabalhava em um projeto internacional com pessoas de culturas diferentes e fisicamente longe(Canada, New York, India etc), as discussões, o controle da situação era tudo diferente de quando estamos com a equipe fisicamente perto.E saber lidar com essa situação nem sempre é uma tarefa fácil.

E as palestras pelo AI? E os mini-cursos? Pow, esses farão falta tb, abaixo limpando o note aqui, achei uns momentos legais. Hehe. Acho que foi um dos momentos mais legais que experimentei na minha vida profissional até hoje. Claro que não vou parar de palestrar, é so mandar o convite que estarei presente :).

Não posso deixar de agradecer aos amigos IBMer que sempre deram aquele apoio em vários momentos aonde a experiência deles que faziam toda diferença, que são eles: Juliano Martins(eng. De Soft), Josy Santos, José Damico, Miro(developer), Katia Pessanha (ex-gerente do AI), Cezar Taurion (Executivo), Ana Carolina (AI). Pessoal obrigado! Foi realmente um prazer ter trabalhado com vocês. Tem um amigo que entrou praticamente junto comigo e que sempre dar uma força de amigo, o Alberto Leal.

Sei que muitos vão perguntar para onde estou indo ne? Bem, o meu destino agora é esse. Ficarei algumas semanas, aprimorando meu inglês em um curso intensivo e tb as minhas queridas férias que venho tentando tirar desde 2005. Quando voltar eu conto pra vcs como foi o intercambio, acredito que quando estiver la, meu acesso à internet será quase zero. Primeiro que estarei bastante ocupado na escola com aula de manha/tarde e outras atividades.

Abracos!! see you next post.

P.S: Eu viajo nesta sexta-feira 20/08 (e so chego em NZ no domingo 22/08 pela manha) e a partir daí já deixei alguns posts programados aqui no blog, possivelmente não poderei responder os comentários, após esta data. Mas, podem enviar que assim que ficar ON, eu já respondo. Dia 21-22/09 estou chegando no Brasil.Mas, tentarei responder antes.

Palestras & Eventos AI IBM

ibmairh

ibmrhai2


simform

Sinform 001

Sinform 012

uesbai2

uesbai

uesbai3


Praticando JSF Facelets no Eclipse

olá Pessoal,

Nesse post vou mostrar como brincar com JSF no Eclipse criando uma simples aplicação usando JSF + facelets e armazenar os dados em um ArrayList. A ideia é mostrar o desenvolvimento simples e ágil com o framework sem Banco de Dados (já mostramos em outros posts como usar JSF + DB veja na categoria JSF).

Lets go…

Note: A versão do JSF que vamos usar aqui é a 1.2. Na versão 2.0 o uso de facelets é padrão. Mas, ainda não “instalei” a nova versão aqui.

Oportunidade Java

profissional desenvolvedor em Java, para um projeto do Banco Votorantim.
> Para adiantar, utilizamos:
> · Hibernate 3.2
> · jfreechart 1.0.12
> · spring 2.5
> · struts 1.3.9
> · quartz 1.6
> · dwr 1.59
> · displaytag 1.1.1
> · jasperreports 3.5.0..
> · Tomcat 6.0
> · Alguns relatórios estão desenvolvidos em iReports

enviar cv para:helio@wbctech.com.br

Requisitos:

  1. JSF + BD

  2. Configurando JSF no eclipse galileo

  3. Instalação TomCat 6.0

Passo 1

Crie um JSF Project.

Vamos criar o JavaBeans para essa aplicação. Que será chamada de Usuário. Portanto crie uma classe Java chamada Usuario dentro do package br.com.camilo. Veja:

package br.com.camilo;
public class Usuario {
	private String nome;
	private String email;
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

Passo 2

Agora precisamos criar um controlador que vai ter como objetivo salvar e exibir os dados.

 package br.com.camilo.controller;
import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import br.com.camilo.Usuario;
public class Controler {
	private Usuario user;
	/*lista de objetos do tipo Usuario, assim podemos acessar os atributos javabean   */
	private ArrayList lista = new ArrayList();
	public ArrayList getLista() {
		return lista;	}

	public void setLista(ArrayList lista) {
		this.lista = lista;
	}
	public Usuario getUser() {
		return user;
	}
	public void setUser(Usuario user) {
		this.user = user;
	}
public Controler(){
	user = new Usuario(); //cria um novo objeto
}

public void adicionar(Usuario us){
	lista.add(us);
}
public void remover(Usuario us){
	lista.remove(us);
}
public String salvar(){
		this.adicionar(user);
		FacesContext context = FacesContext.getCurrentInstance(); //criando uma instancia FacesContext
		FacesMessage message = new FacesMessage("Salvo com sucesso");
		context.addMessage(null, message);
		return "salvar";
	}
	public DataModel getExibir(){//retorna os elementos na lista
		return  new ListDataModel(lista);
	}
	//cria um novo objeto, quando o botao novo for chamado
	public String novo(){
		user = new Usuario();
		return "novo";
	}
	public String remover(){
		this.remover(user);
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message = new FacesMessage("Removido com sucesso");
		context.addMessage(null, message);
		return "remover";
	}
}

Passo 3

Criar o formulario e a pagina de resultado. Para isso crie uma arquivo chamado formemail.xhtml e outro no chamado de resultado.xhtml.

Deixe seu arquivo conforme o code abaixo:

Cadastro

Altere o arquivo resultado.xhtml:

Novo Cadastro Remover

Passo 5

Agora precisamos configurar o arquivo faces-web.xml. Abra o faces-web.xml no modo source e adicione o code abaixo:

passo 6

Agora vamos testar aplicação clique com o botao direito sobre o arquivo formemail.xhtml e escolha a opcao abaixo:

Na próxima tela vá no diretorio apache = => e escolha TomCat 6.0 e clique em finish. Aguarde o web browser dentro do eclipse abrir e teste aplicação. Veja alguns prints.

note: Esses plugins para wordpress tem hora que stressa e bagunça todo o code. Mas, estou deixando o projeto para download, aqui.

Valeu!Pessoal, Espero que tenham gostado. Até o próximo post.

InfoQ: Entendendo como funciona a SCJP

Olá Pessoal,

O post desta semana está no InfoQBrasil. Primeiramente, estou bastante feliz pela equipe do InfoQ ter aceitado meu post e publicado.Desde já agradeço à equipe pela atenção e o apoio na revisão do artigo. Neste post estou falando sobre à SCJP, porém dessa vez abordo um pouco sobre o exame, tirando dúvidas tais como:

  • qual versão fazer 5 ou 6?

  • inglês ou português?

  • O tempo é suficiente?

  • Compensa investir na SCJP?

Outro ponto que não deixei de lado foi abordar as mudanças que a Oracle tem feito nas certificações Java e no processo de aquisição do voucher.

Também aproveitei o momento para responder algumas dúvidas se meu livro Guia do Exame serve para SCJP 6. Se você quer saber todas as respostas confira o post no link a seguir:

http://www.infoq.com/br/articles/como-funciona-a-scjp

Abracos, see you next post. :).

selectOneMenu JSF com BD

olá Pessoal,

Hoje vou mostrar como criar preencher um selectOneMenu com dados vindo do Banco de Dados. Há várias formas de fazer isso, no blog o rponte você vai ver alguns posts bem interessante sobre o assunto. Vou mostrar abaixo como deixar seu selectOneMenu dinâmico pegando os dados do BD.

Tive como referência o livro do autor Edson Gonçalves em seu livro Dominando JSF.

lets go…

Posts Recomendados

Note: Para o exemplo a seguir usei o Hibernate puro para persistência e o TomCat 6 como servidor.

Preparando o ambiente:

  1. crie seu projeto JSF e sua página jsp ou xhtml

Aqui vamos usar xhtml, mas nada impede de usar .jsp o código JSF não vai mudar se vc criou um dos dois arquivos acima.

  1. Não esqueça de criar uma tabela no seu banco de dados. Aqui chamamos ela de cargo

Desenvolvendo

  1. Na sua classe DAO, crie um método que vai retornar todos cargos cadastrados:

    //retorna todos os cargos cadastrados
    	public List listaCargo(){
    		Query query = getSession().createQuery("from Cargo");
    		Listlista = query.list(); 
    
    		return lista;
    	}
  2. Na ControllerCargo você deve ter o método e a variável abaixo.

    public class ControllerCargo {
    	private Cargo cargo;
    	private Map cargoitem=null;
    	private ListDataModel model; 
    
    	public ControllerCargo() {
    		cargo = new Cargo();
    	}
    //outros codes foram omitidos, pois não tem importância para o objetivo do post
    
    //será armazenado no selectOneMenu
    	public Map getCargos(){
    	CargoDAO cargodao = new CargoDAO();
    	cargoitem = new LinkedHashMap();
    	for(Iterator iter =cargodao.listaCargo().iterator();iter.hasNext();){
    	Cargo c = (Cargo) iter.next();
    	 //armazenando os cargos encontrados no bd em um map
    		cargoitem.put(c.getFuncao(), c.getFuncao());
    	}
    	return cargoitem;}
  3. Essa aqui é nossa classe cargo:

    public class Cargo {
    	private int id;
    	private String funcao;
    	private String area;
    //gets/sets omitidos
  4. criamos uma página em xhtml (poderia ser em JSP) que tem o selectOneMenu carregado com os cargos que estao na tabela no BD, veja como ficou o code:
<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >
<f:selectItems value=”#{controllerCargo.cargos}” />
</input>

<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >

<f:selectItems value=”#{controllerCargo.cargos}” />

</input>


    Erro comum

    1. um erro comum é não prestar atencao no S que temos entre selectItems e seletecItem, se vc deixar no singular, terá problemas ao executar a página. Afinal de contas você informou que vai receber uma coleção de dados.

    Teste

    Veja abaixo o exemplo do selectOneMenu pegando informações que vem do BD. temos um formulário e logo a seguir um select do banco de dados.

    selectonebdjsf

    Vou ficando por aqui pessoal e até a proxima, espero que tenham gostado, o objetivo aqui foi apresentar um ponto bem especifico, por isso não coloquei todo o código para não perder o foco. Até porque nada mudou nas outras classes.

    Abracos, see you next post.