Erro ao tentar salvar classe no banco de dados [hibernateJPA]

Olá!

Estou seguindo um tutorial para aprender a utilizar o hibernate JPA.
Fiz um banco com apenas uma tabela para verificar se eu conseguiria realizar a conexão e fazer o mapeamento corretamente. Mesmo parecendo uma tarefa simples ela está me dando muito dor de cabeça hahahaha.

Fiz toda minha aplicação, as Facade, DAO, Bean e View.
Quando executo a View e tento inserir o registro no banco tenho o seguinte retorno

Set 01, 2012 12:33:56 PM org.apache.catalina.core.StandardWrapperValve invoke Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/teste] threw exception [java.lang.NoClassDefFoundError: Could not initialize class br.com.unip.teste.dao.ProdutoDAO] with root cause java.lang.NoClassDefFoundError: Could not initialize class br.com.unip.teste.dao.ProdutoDAO at br.com.unip.teste.facade.ProdutoFacade.<init>(ProdutoFacade.java:11) at br.com.unip.teste.bean.ProdutoBean.getProdutoFacade(ProdutoBean.java:21) at br.com.unip.teste.bean.ProdutoBean.createProduto(ProdutoBean.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:264) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

O problema é que toda minha estrutura está certa, já conferi a codificação e não estou encontrando o problema.
Será que alguém poderia me dar uma luz??

Abaixo a codificação que estou usando:

Produto

[code]package br.com.unip.teste.model;

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;

/**

  • The persistent class for the Produto database table.

*/
@Entity
@Table(name=“Produto”)
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int idProduto;

@Column(name="Descricao", nullable=false, length=100)
private String descricao;

@Column(name="Preco", nullable=false, precision=9, scale=5)
private BigDecimal preco;

public Produto() {
}

public int getIdProduto() {
	return this.idProduto;
}

public void setIdProduto(int idProduto) {
	this.idProduto = idProduto;
}

public String getDescricao() {
	return this.descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public BigDecimal getPreco() {
	return this.preco;
}

public void setPreco(BigDecimal preco) {
	this.preco = preco;
}

}[/code]

ProdutoFacade

[code]package br.com.unip.teste.facade;

import java.io.Serializable;
import java.util.List;
import br.com.unip.teste.model.Produto;
import br.com.unip.teste.dao.ProdutoDAO;

public class ProdutoFacade implements Serializable {
private static final long serialVersionUID = 1L;

private ProdutoDAO produtoDAO = new ProdutoDAO();

public void createProduto(Produto produto) {
	produtoDAO.beginTransaction();
	produtoDAO.save(produto);
	produtoDAO.commitAndCloseTransaction();
}

public void updateProduto(Produto produto) {
	produtoDAO.beginTransaction();
	Produto persistedProduto = produtoDAO.find(produto.getIdProduto());
	persistedProduto.setDescricao(produto.getDescricao());
	produtoDAO.update(persistedProduto);
	produtoDAO.commitAndCloseTransaction();
}

public Produto findProduto(int produtoId) {
	produtoDAO.beginTransaction();
	Produto produto = produtoDAO.find(produtoId);
	produtoDAO.closeTransaction();
	return produto;
}

public List<Produto> listAll() {
	produtoDAO.beginTransaction();
	List<Produto> result = produtoDAO.findAll();
	produtoDAO.closeTransaction();
	return result;
}

public void deleteProduto(Produto produto) {
	produtoDAO.beginTransaction();
	Produto persistedFormaPgto = produtoDAO.findReferenceOnly(produto.getIdProduto());
	produtoDAO.delete(persistedFormaPgto);
	produtoDAO.commitAndCloseTransaction();
}

}
[/code]

ProdutoBean

[code]package br.com.unip.teste.bean;

import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import br.com.unip.teste.facade.ProdutoFacade;
import br.com.unip.teste.model.Produto;

@ViewScoped
@ManagedBean(name=“ProdutoBean”)
public class ProdutoBean extends AbstractBean implements Serializable {
private static final long serialVersionUID = 1L;

private Produto produto;
private List<Produto> produtos;
private ProdutoFacade produtoFacade;

public ProdutoFacade getProdutoFacade() {
	if (produtoFacade == null) {
		produtoFacade = new ProdutoFacade();
	}

	return produtoFacade;
}

public Produto getProduto() {
	if (produto == null) {
		produto = new Produto();
	}

	return produto;
}

public void setProduto(Produto produto) {
	this.produto = produto;
}

public void createProduto() {
	try {
		getProdutoFacade().createProduto(produto);
		closeDialog();
		displayInfoMessageToUser("Registro criado com sucesso!");
		loadProduto();
		resetProduto();
	} catch (Exception e) {
		keepDialogOpen();
		displayErrorMessageToUser("Ocorreu um erro na transação! Tente novamente.");
		e.printStackTrace();
	}
}

public void updateProduto() {
	try {
		getProdutoFacade().updateProduto(produto);
		closeDialog();
		displayInfoMessageToUser("Registro alterado com sucesso!");
		loadProduto();
		resetProduto();
	} catch (Exception e) {
		keepDialogOpen();
		displayErrorMessageToUser("Ocorreu um erro na transação! Tente novamente.");
		e.printStackTrace();
	}
}

public void deleteProduto() {
	try {
		getProdutoFacade().deleteProduto(produto);
		closeDialog();
		displayInfoMessageToUser("Registro excluído com sucesso!");
		loadProduto();
		resetProduto();
	} catch (Exception e) {
		keepDialogOpen();
		displayErrorMessageToUser("Ocorreu um erro na transação! Tente novamente.");
		e.printStackTrace();
	}
}

public List<Produto> getAllProduto() {
	if (produtos == null) {
		loadProduto();
	}

	return produtos;
}

private void loadProduto() {
	produtos = getProdutoFacade().listAll();
}

public void resetProduto() {
	produto = new Produto();
}

}[/code]

DAOFactory

[code]package br.com.unip.teste.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;

abstract class DAOFactory implements Serializable {
private static final long serialVersionUID = 1L;

private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("teste");
private EntityManager em;

private Class<T> entityClass;

public void beginTransaction() {
	em = emf.createEntityManager();

	em.getTransaction().begin();
}

public void commit() {
	em.getTransaction().commit();
}

public void rollback() {
	em.getTransaction().rollback();
}

public void closeTransaction() {
	em.close();
}

public void commitAndCloseTransaction() {
	commit();
	closeTransaction();
}

public void flush() {
	em.flush();
}

public void joinTransaction() {
	em = emf.createEntityManager();
	em.joinTransaction();
}

public DAOFactory(Class<T> entityClass) {
	this.entityClass = entityClass;
}

public void save(T entity) {
	em.persist(entity);
}

public void delete(T entity) {
	T entityToBeRemoved = em.merge(entity);

	em.remove(entityToBeRemoved);
}

public T update(T entity) {
	return em.merge(entity);
}

public T find(int entityID) {
	return em.find(entityClass, entityID);
}

public T findReferenceOnly(int entityID) {
	return em.getReference(entityClass, entityID);
}

// Using the unchecked because JPA does not have a
// em.getCriteriaBuilder().createQuery()<T> method
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<T> findAll() {
	CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
	cq.select(cq.from(entityClass));
	return em.createQuery(cq).getResultList();
}

// Using the unchecked because JPA does not have a
// query.getSingleResult()<T> method
@SuppressWarnings("unchecked")
protected T findOneResult(String namedQuery, Map<String, Object> parameters) {
	T result = null;

	try {
		Query query = em.createNamedQuery(namedQuery);

		// Method that will populate parameters if they are passed not null and empty
		if (parameters != null && !parameters.isEmpty()) {
			populateQueryParameters(query, parameters);
		}

		result = (T) query.getSingleResult();

	} catch (NoResultException e) {
		System.out.println("No result found for named query: " + namedQuery);
	} catch (Exception e) {
		System.out.println("Error while running query: " + e.getMessage());
		e.printStackTrace();
	}

	return result;
}

private void populateQueryParameters(Query query, Map<String, Object> parameters) {
	for (Entry<String, Object> entry : parameters.entrySet()) {
		query.setParameter(entry.getKey(), entry.getValue());
	}
}

}[/code]

ProdutoDAO

[code]package br.com.unip.teste.dao;

import br.com.unip.teste.model.Produto;

public class ProdutoDAO extends DAOFactory{
private static final long serialVersionUID = 5150258159318448018L;

public ProdutoDAO() {
	super(Produto.class);
}

}
[/code]

Agradeço desde já pela ajuda!

Este tipo de erro que você está tendo é um erro um tanto genérico quando se trata de JPA, para saber o que realmente está ocorrendo, crie um método main e tente executar uma das suas funções do facade ou simplesmente uma select em uma das tabelas, neste momento você terá o erro que realmente está ocorrendo, as vezes é um pequeno detalhe que empaca tudo :lol:

E sabe o que é pior? O erro é que o Eclipse não estava com a lib do conector do banco.
Não entendo porque quando adiciono a lib na criação do projeto ela não funciona, tenho sempre que ir lá no web-inf\lib e adicionar ela na mão.

E também tive que mudar o banco, simplesmente não consigo realizar a configuração do JPA com o SQL Server 2008, não funciona. Já com o Mysql, em poucos cliques, tudo funcionando.

Mas ainda estou na busca aqui pra tentar fazer funcionar o SQL Server com o hibernate JPA.
Muito obrigado pela resposta amigo!
Até mais.

O eclipse tem umas burrices de vez em qdo ^^, alias, não burrice, se você configurar o classpath do teu projeto e no teu apache não estiver apontando para as libs que o teu projeto está mapeado com as libs, ele não fará a leitura, a não ser que você as coloque dentro do projeto manualmente. Mas bem, se ja deu jeito, beleza então =D

Po então é por isso, eu apontei a lib apenas na hora que criei o projeto, mas não sabia que tinha que apontar no Tomcat também.
Como faço isso?

Valeu desde já!!

Olha so como é chato isso kkkkk

Primeiro:

WEB-INF/lib <-- se estiver com os jars do teu projeto ali dentro vai funcionar no tomcat sem precisar apontar no tomcat.

Segundo:

Se você apontar no path do teu projeto, em tese, já bastava, mas não funciona em algumas versões do eclipse, funcinará para compilar o código ali no eclipse, mas tem um detalhe, se não estiver na lib e no path não funcionará, ainda mais chato kkkkkkk

Terceiro:

Apontando o tomcat para uma pasta de libs e facil:

  1. Acessa a pasta conf do teu tomcat e edite o arquivo "catalina.properties";
  2. Procure por "common.loader = …" ja haverá alguns itens lá do próprio tomcat, basta no final da linha você adicionar ", ${catalina.home}/lib/meusjars/.jar" julgando que você crie uma pasta dentro da pasta lib do tomcat com o nome meusjars, senão, coloque o caminho completo, "C:/…/…/.jar"
  3. Deitar e rolar que ta feito kkkkkkkkkk