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.! 🙂

28 comentários em “JPA com Hibernate + JSF + MySQL”

  1. Lembro-me que você me deu um incentivo enorme quando eu estava estudando JAVA. Hoje sou desenvolvedor, e isso já faz quase dois anos.

    Como sempre, respostas esclarecedoras para caminhos sinuosos.
    Sucesso!

    By the way, ótimo artigo!

  2. Tô muito interessado em aprender Hibernate. Até hoje só utilizei JPA. Vendo essda aplicação, não parece ser tão difícil.

    Camilo, vc poderia postar o download novamente dos jars do Hibernate? Baixei 2 vezes e quando tento abrir a pasta aparece como inválida e corrompida. Baixei tbm o arquivo do JSF e tbm tá com o mesmo problema.

    É isso aí cara, valeu!

    1. olá anderson,

      que estranho, deletei os arquivos e subir novamente, dar uma olhada ai se está ok, aqui ta normal, nao ta corrompido nao.
      Um detalhe que reparei antes é que com o winzip dar merda, porem com o winrar nao.
      abracos,

  3. Agora sim está tudo certo. Baixei os 2 arquivos e consegui extrair os jars.

    Obrigado Camilo!

  4. Camilo, pra rodar esse exemplo no jBoss ou glassfish tem alguma coisa que eu preciso acrescentar?

    Estou com o projeto rodando normal no GlassFish

    Porem quando eu chamo o servlet que executa um cadastro no banco da o seguinte erro

    javax.persistence.PersistenceException: No Persistence provider for EntityManager named cadastro

    no caso o meu persistence-unit chama cadastro

    Estou a 2 dias tentando rodar um JPA no JBoss e nao consigo, agora passei pro netbeans+glassfish e esta dando o mesmo problema

    To ficando loco já iuahiuah

    Se puder ajudar ficarei grato

    Valeww

    1. opa, bruno
      pela leitura do erro, é questao de configuracao do persistence, eu tb ja apanhei com isso no tomcat, mas eu nunca usei os servidores mencionados por vc para testar o exemplo acima. dar uma olhada na documentacao se nao tem algo.
      flw. abracos,

  5. Gostaria de saber se não tem nenhuma anotação no ClienteConntroller, tais como, @ManagedBean e o seu scope

  6. Camilo,
    ao executar na minha maquina, seguindo o seu tuto deu o seguinte erro:
    /index.xhtml @16,150 value=”#{loginController.login.nome}”: Target Unreachable, identifier ‘loginController’ resolved to null.

    Será que vc poderia me ajudar?
    Obrigado!

  7. CamiloLopes muito obrigado pelo post. Ele foi de grande ajuda.
    Consegui resolver meu problema, pois o erro estava no local onde é colocado o arquivo de configuração (persistence.xml). No seu tutorial ele é colocado na pasta META-INF, porém acho que isso só vale pro eclipse, pois no netbeans é colocado direto no projeto e o netbeans encaminha para o local correto. Fica ai a dica..

  8. olá, sei que o tutorial é antigo mas se alguem puder me ajudar, nem consigo testar a pagina pois meu jboss 5 não carrega, dá a seguinte mensagem:

    Error installing to Start: name=persistence.unit:unitName=#sistemas state=Create
    java.lang.RuntimeException: Specification violation [EJB3 JPA 6.2.1.2] – You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: sistemas

  9. Na parte Criando as pages JSF, você fala de 3 páginas, mas só vi uma, como ele redireciona do indes.jsp para cadastro.jsf??? O que tem na index e na cadsrto e a outro, qual é?

    1. opa! emir, obrigado pelo feedback, acabei escrevendo errado, na verdade no inicio eu tinha pensando em tres, mas depois reduzir e nao mudei no texto. Observe que são apenas duas paginas, a index.jsp é que tem o formulario e a segunda, é da mensagem que nao precisa ser apresentada, pq é uma pagina jsp qualquer com uma mensagem de sucesso. E pela image do face-config.xml temos as duas paginas conversando.
      abracos,

  10. Camilo sei que o post é antigo mas resolveu o meu problema a única dúvida é porque existe a necessidade de instanciar um Objeto, na classe DAO, EntityManager e passar para ele o getEntityManager da super classe ao invés de se usar diretamente o getEntityManager da super classe !?

    Obrigado Abraço

    1. olá Fernando,
      Instanciamos o DAO na classe DAO? olhando o post, a há uma instancia no controller para o xxxDAO. Não entendi muito bem a pergunta.

      flw.

  11. @camilolopes
    Oi Camilo vou exemplificar com código! Porque fazer isso:

    public void salvar(Cliente cliente){

    EntityManager em = getEntityManager();
    try{

    em.getTransaction().begin();

    em.persist(cliente);

    em.getTransaction().commit();
    }catch (Exception e) {

    em.getTransaction().rollback();
    }

    Em vez Disso:

    public void salvar(Cliente cliente){

    try{

    getEntityManager().getTransaction().begin();

    getEntityManager().persist(cliente);

    getEntityManager().getTransaction().commit();
    }catch (Exception e) {

    getEntityManager().getTransaction().rollback();
    }

    Era assim que estava a minha implementação e não dava certo de jeito nenhum depois que olhando no seu exemplo você instancia um EntityManager em e passa como valor o getEntityManager() da super . é essa a minha dúvida porque não funciona diretamente!

    Abraços

    1. Fernando,
      fernando realmente não vai funcionar, para cada getEntityManager() que tu chama, tu tem um objeto novo concorda? então no teu catch e outras invocações tu nao tem o mesmo objeto diretamente, estamos lidando com variaveis de instância e não static, percebeu o pulo do gato? e pq temos que ter o objeto antes ?
      abracos,

  12. Entendi sim Camilo!!! ta na minha kra e eu não imaginei isso! Obrigado pela reposta! um abraço e sucesso pra ti!

  13. Bom dia Camilo,

    Estou com um problema quanto tento subir a aplicação do jboss no servidor, infelizmente, esta com esse erro de persistence que eu não consigo resolver. Será que tem como você me ajudar, desde já muito obrigado.

    08:23:58,389 INFO [CollectionBinder] Mapping collection: br.unicamp.sigm.cad_unico.jpa.Pfj.blocoNotasSet -> BLOCO_NOTAS
    08:23:58,389 INFO [CollectionBinder] Mapping collection: br.unicamp.sigm.cad_unico.jpa.Pfj.caixasPostaisSet -> CAIXAS_POSTAIS
    08:23:58,390 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=sigm_main.ear/sigm_ejb3_almoxarifado.jar#sigm_ejb3_almoxarifadoPU state=Create
    org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: br.unicamp.sigm.cad_unico.jpa.Pfj.consorciosSet[br.unicamp.sigm.cad_unico.jpa.Consorcios]
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1071)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:602)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:543)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:329)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:425)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:131)
    at org.jboss.jpa.deployment.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:301)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
    at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:150)
    at org.jboss.joinpoint.plugins.BasicMethodJoinPoint.dispatch(BasicMethodJoinPoint.java:66)
    at org.jboss.kernel.plugins.dependency.KernelControllerContextAction$JoinpointDispatchWrapper.execute(KernelControllerContextAction.java:241)
    at org.jboss.kernel.plugins.dependency.ExecutionWrapper.execute(ExecutionWrapper.java:47)
    at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContextAction.java:109)
    at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchJoinPoint(KernelControllerContextAction.java:70)
    at org.jboss.kernel.plugins.dependency.LifecycleAction.installActionInternal(LifecycleAction.java:221)
    at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54)
    at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42)
    at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
    at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
    at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:774)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540)
    at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:121)
    at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:51)
    at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
    at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
    at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
    at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
    at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
    at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
    at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
    at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
    at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
    at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
    at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
    at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
    at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
    at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
    at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
    at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
    at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
    at org.jboss.Main.boot(Main.java:221)
    at org.jboss.Main$1.run(Main.java:556)
    at java.lang.Thread.run(Thread.java:662)
    08:23:58,550 INFO [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=sigm_main.ear/sigm_ejb3_cad_unico.jar#sigm_ejb3_cad_unicoPU
    08:24:01,313 INFO [SessionSpecContainer] Starting jboss.j2ee:ear=sigm_main.ear,jar=sigm_ejb3_cad_unico.jar,name=EnderecosServiceBean,service=EJB3
    08:24:01,319 INFO [EJBContainer] STARTED EJB: br.unicamp.sigm.cad_unico.bo.EnderecosServiceBean ejbName: EnderecosServiceBean
    08:24:01,330 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

    1. Anderson,

      Lendo as mensagens de erros que são sempre objetivas. Vi que vc está com problema no seu mapeamento. Sugiro vc revisar os mapeamentos da sua classe, principalmente o @oneToMany e @ManyToMany.

      flw.

  14. Vc nao usa o arquivo web.xml?? E o faces-config?? Por que nao usa eles??
    Outra coisa. Tá dando o seguinte erro ao eexecutar:

    type Status report

    message /JPAWebBlog/

    description The requested resource (/JPAWebBlog/) is not available.

    ——————————————————————————–

    Apache Tomcat/7.0.27

    1. Roger,

      Acho que vc não viu o post direito. Há o face-config.xml. E o web.xml nada foi alterado. Não motivo para colocá-lo. Sem falar que o post já considera que o leitor conhece o básico de JSF. Se seguir os passos corretos e ter uma noção básica como uma aplicação JEE com JSF funciona vai ver que tu vai rodar corretamente.

      abracos,

  15. Boa tarde Camilo,
    Estou com um erro ao persistir no banco… conferindo trace do jboss ele me retorna o erro:
    “javax.servlet.ServletException: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection”
    “15:38:57,732 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http-localhost-127.0.0.1-8080-1) HHH000319: Could not get database metadata: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/automoveis”
    o erro e o mesmo tanto n seu tutorial como em uma outra aplicaçao que estou fazendo.
    ja usei varias versões de lib do mysql e msm assim o problema persiste.
    vc tem alguma ideia do que poderia fazer?

  16. Camilo, excelente tutorial! Eu só fiquei travado na configuração do faces-config
    Será que você pode me enviar o código fonte do seu faces-config.xml?

Deixe um comentário para Anderson Ribeiro Cancelar resposta

O seu endereço de e-mail não será publicado.