Hibernate gera a tabela porém não consegue cadastrar o objeto

Olá pessoal,
Tenho uma dúvida em relação ao hibernate.

Criei minha classe Tarefa como um bean, fiz o mapeamento para o hibernate, utilzando Anotations, e conseguí gerar a tabela no banco de dados. Fiz o mesmo processo com minha classe Usuario, e tudo foi gerado com sucesso também.

Criei minhas classes DAO, a classe UsuarioDAO está funcionando sem problema nenhum, consigo adicionar sem problemas meus contatos.

O meu problema, é quando vou utilizar a classe TarefaDAO, o hibernate diz que não conhece a entidade. Porém acho estranho, visto que ele conseguiu criar a tabela no banco de dados.

Estou utilzando Hibernate + Struts2 no meu projeto.

Segue o erro:

org.hibernate.MappingException: Unknown entity: br.com.taskslist.bean.Tarefa
	org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:628)
	org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1366)
	org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
	org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
	org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
	br.com.taskslist.dao.TarefaDAO.CadastraTarefa(TarefaDAO.java:19)
	br.com.taskslist.action.CadastrarTarefaAction.cadastra(CadastrarTarefaAction.java:52)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

Tarefa Bean

package br.com.taskslist.bean;

import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import com.sun.istack.internal.NotNull;

@Table(name="tb_tarefas")
@Entity

public class Tarefa {

	@Id
	@GeneratedValue
	private Long codigo;
	
	@NotNull
	private String titulo;
	
	private String descricao;
	
	@NotNull
	private Calendar dataFinal;
	
	private long percentagemFinalizado;
	private boolean finalizado;
	private Calendar dataFinalizado;
	private Long idUsuario;

	
	public Long getIdUsuario() {
		return idUsuario;
	}
	public void setIdUsuario(Long idUsuario) {
		this.idUsuario = idUsuario;
	}
	public Long getCodigo() {
		return codigo;
	}
	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public Calendar getDataFinal() {
		return dataFinal;
	}
	public void setDataFinal(Calendar dataFinal) {
		this.dataFinal = dataFinal;
	}
	public long getPercentagemFinalizado() {
		return percentagemFinalizado;
	}
	public void setPercentagemFinalizado(long percentagemFinalizado) {
		this.percentagemFinalizado = percentagemFinalizado;
	}
	public boolean isFinalizado() {
		return finalizado;
	}
	public void setFinalizado(boolean finalizado) {
		this.finalizado = finalizado;
	}
	public Calendar getDataFinalizado() {
		return dataFinalizado;
	}
	public void setDataFinalizado(Calendar dataFinalizado) {
		this.dataFinalizado = dataFinalizado;
	}


}

TarefaDAO

package br.com.taskslist.dao;

import java.util.List;

import org.hibernate.Session;

import br.com.taskslist.bean.Tarefa;

public class TarefaDAO {
	private Session session;
	
	public TarefaDAO(Session session)
	{
		this.session = session;
	}
	
	public void CadastraTarefa(Tarefa tarefa)
	{	
		this.session.save(tarefa);
	}
	
	public List<Tarefa> ListaTarefas()
	{
		return this.session.createCriteria(Tarefa.class).list();
	}
}

CadastrarTarefaAction (Servlet)

package br.com.taskslist.action;

import java.util.Calendar;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.hibernate.Session;

import br.com.taskslist.bean.Tarefa;
import br.com.taskslist.dao.TarefaDAO;
import br.com.taskslist.hibernate.HibernateUtil;

public class CadastrarTarefaAction 
{

	private Tarefa tarefa;
	private String erroTitulo;
	private String erroData;
	
	@Action(value="CadastrarTarefa", results={
			@Result(name="ok", location="/jsp/tarefa-cadastrada.jsp"),
			@Result(name="erro", location="/jsp/cadastrar-tarefa.jsp")
		})
	public String cadastra()
	{
		
		Session session = new HibernateUtil().getSesstion();
		TarefaDAO dao = new TarefaDAO(session);
		boolean erro = false;
		
		if(tarefa.getTitulo()== null || tarefa.getTitulo().isEmpty())
		{
			erroTitulo = "Título não deve ser deixado em branco";
			erro = true;
		}
		if(tarefa.getDescricao() == null || tarefa.getDescricao().isEmpty())
		{
			tarefa.setDescricao("");
		}
		if(tarefa.getDataFinal() == null)
		{
			erroData = "Favor preencher a data corretamente";
			erro = true;
		}
		if(erro)
			return "erro";
		
		tarefa.setFinalizado(false);
		tarefa.setDataFinal(Calendar.getInstance());
		tarefa.setPercentagemFinalizado((long)0);
		session.beginTransaction();
			dao.CadastraTarefa(tarefa);
		//session.getTransaction().commit();
		return "ok";
	}

		
	public Tarefa getTarefa() {
		return tarefa;
	}

	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}


	public String getErroTitulo() {
		return erroTitulo;
	}


	public String getErroData() {
		return erroData;
	}
	
	
	
	
}

O que mais me surpreende é a parte de Usuário (bean, dao e action) estar funcionando sem problema nenhum.

Alguém tem alguma dica do que pode ser?

import com.sun.istack.internal.NotNull;  
@Entity  
@Table(name="tb_tarefas")  

pode ser isso;…

Olá Alan,

A classe Usuario possui as mesmas anotações e imports

package br.com.taskslist.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import com.sun.istack.internal.NotNull;

@Table(name="tb_usuarios")
@Entity
public class Usuario {

	@Id
	@GeneratedValue
	private Long codigo;
	
	@NotNull
	private String nome;
	@NotNull
	private String login;
	@NotNull
	private String senha;
	@NotNull
	private String email;
	
	
	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;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
	
}

[quote=alanbrasil1984] import com.sun.istack.internal.NotNull; @Entity @Table(name="tb_tarefas")

pode ser isso;…[/quote]

qual é a forma de conexão que vc usa? persistence.xml se for o caso, veja se vc ja mapeou no xml.

Utilizo o arquivo hibernate.properties

hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost/tasks
hibernate.connection.username = root
hibernate.connection.password=
hibernate.show_sql = true
hibernate.format_sql = true

Você definiu a classe no hibernate.cfg.xml ?

Então, não possuo este arquivo.

Apenas copiei os .jars para o meu projeto.

A propósito, meu projeto do Struts (mesmo projeto) também não possui o struts.xml, quando coloco o site passa a não funcionar, dá erro 404.

[URL=http://img233.imageshack.us/i/capturadetelacc.png/][/URL]