JPA e campo timestamp [RESOLVIDO]

3 respostas
yurifw

eu estou usando o mysql e uma das minhas tabelas tem alguns campos timestamp, eu criei o banco e todo o mapeamento foi feito automaticamente pelo netbeans, mas qdo vou fazer uma consulta acontece o erro:

Internal Exception: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
Error Code: 0
Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, pontos, previsao_termino, status, titulo, projeto FROM tarefa
Exception in thread "AWT-EventQueue-0" Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, pontos, previsao_termino, status, titulo, projeto FROM tarefa")
Internal Exception: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
Error Code: 0
Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, pontos, previsao_termino, status, titulo, projeto FROM tarefa
Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, pontos, previsao_termino, status, titulo, projeto FROM tarefa")
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)

eu acho q o erro está acontecendo porque ele está tentando inserir o valor 0000-00-00 00:00:00 em um campo Date, q n suporta hora, eu ja tentei mudar o campo pra outros tipos de dados e tb n deu certo, pelo que eu consegui achar nas minhas pesquisas o campo Date ta certo, alguem sabe o que está acontecendo?

os atributos da minha entidade:

package entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "tarefa")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Tarefa.findAll", query = "SELECT t FROM Tarefa t"),
    @NamedQuery(name = "Tarefa.findById", query = "SELECT t FROM Tarefa t WHERE t.id = :id"),
    @NamedQuery(name = "Tarefa.findByDescricao", query = "SELECT t FROM Tarefa t WHERE t.descricao = :descricao"),
    @NamedQuery(name = "Tarefa.findByTitulo", query = "SELECT t FROM Tarefa t WHERE t.titulo = :titulo"),
    @NamedQuery(name = "Tarefa.findManyByTitulo", query = "SELECT t FROM Tarefa t WHERE t.titulo like :titulo order by t.titulo"),
    @NamedQuery(name = "Tarefa.findByDataCadastro", query = "SELECT t FROM Tarefa t WHERE t.dataCadastro = :dataCadastro"),
    @NamedQuery(name = "Tarefa.findByDataInicio", query = "SELECT t FROM Tarefa t WHERE t.dataInicio = :dataInicio"),
    @NamedQuery(name = "Tarefa.findByPrevisaoTermino", query = "SELECT t FROM Tarefa t WHERE t.previsaoTermino = :previsaoTermino"),
    @NamedQuery(name = "Tarefa.findByDataFim", query = "SELECT t FROM Tarefa t WHERE t.dataFim = :dataFim"),
    @NamedQuery(name = "Tarefa.findByPontos", query = "SELECT t FROM Tarefa t WHERE t.pontos = :pontos"),
    @NamedQuery(name = "Tarefa.findByStatus", query = "SELECT t FROM Tarefa t WHERE t.status = :status")})
public class Tarefa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "descricao")
    private String descricao;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "data_cadastro")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    @Column(name = "data_inicio")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataInicio;
    @Column(name = "previsao_termino")
    @Temporal(TemporalType.TIMESTAMP)
    private Date previsaoTermino;
    @Column(name = "data_fim")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataFim;
    @Column(name = "pontos")
    private Integer pontos;
    @Basic(optional = false)
    @Column(name = "status")
    private String status;
    @JoinColumn(name = "projeto", referencedColumnName = "id")
    @ManyToOne
    private Projeto projeto;

3 Respostas

drsmachado

Eu sinceramente excomundo código feito pelo netbeans…
Nem sempre ele é útil. Fazer na mão é bem mais trabalhoso, concordo, mas tem-se a certeza de bom código.
Se ele tentar inserir qualquer data como ‘0000-00-00’ independente da hora, ele não conseguirá. O MySQL sabe que não houve ano 0 (a contagem de tempo não possui ano 0, apenas 1 A.C. e 1 D.C.), logo o problema é este.
Você deve definir uma data padrão ou alterar para que as colunas possam receber um valor null.

yurifw

era isso mesmo cara, mto obrigado, resolvi aki, mto obrigado mesmo xD
vlw ^^ eu vou aproveitar e ver se começo o escrever o meu proprio codigo entao, vou dar uma olhada aki xD

drsmachado

Acredito que o primeiro passo seja usar uma outra IDE, como o Eclipse.
Ele te forçará a fazer muita coisa manualmente. Isso pode parecer cruel a princípio, mas é fundamental a longo prazo.
Você vai repetir muita escrita de código e isso te permitirá memorizar e realmente aprender a codificar.

Criado 23 de julho de 2012
Ultima resposta 23 de jul. de 2012
Respostas 3
Participantes 2