[RESOLVIDO]Hibernate não consegue ler Timestamp?

Fala galera.

Tenho uma duvida com relação que surgiu após tentativas de listar uma tabela que contém atributos do tipo Timestamp.

Especificando o meu problema talvez fique mais facil de entender:

Tenho uma tabela que entre seus campos tem dois timestamp, um dos campos deve pegar a data e horario do sistema gerado no momento que um usuario é inserido na tabela, em melhores palavras, a data e horario que o usuario foi cadastrado no sistema.

E o outro campo seria pra quando algum dado do usuario fosse alterado, assim teriamos data e horario de quando o usuario fosse cadastrado e atualizado em campos DIFERENTES;

O Mysql aceita que apenas um campo receba a data e horario do sistema, com o CURRENT_TIMESTAMP;

Tenho tentado listar essa tabela de usuarios e recebo a seguinte mensagem:

INFO: could not read column value from result set: atualizado9_0_; Cannot convert value ‘0000-00-00 00:00:00’ from column 3 to TIMESTAMP.
01/06/2011 09:26:15 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 0, SQLState: S1009
01/06/2011 09:26:15 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Cannot convert value ‘0000-00-00 00:00:00’ from column 3 to TIMESTAMP.

Existe a possibilidade de o hibernate ter algum conflito com dados do tipo timestamp ???

E como eu poderia resolver este problema ???

Posta o entity (e se usa xml, o mapeamento do mesmo).
Acredito que seja quanto a definição do tipo Temporal…

Beleza vamos lá

[code]amk_vendedor

@Entity
public class amk_vendedor {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int cd;
private int emp_vendedor;
private int cd_vendedor;
private String cd_localizador;
private String nm_localizador;
private String ativo;
private Timestamp cadastrado;
private Timestamp atualizado;
public int getCd() {
	return cd;
}
public void setCd(int cd) {
	this.cd = cd;
}
public int getEmp_vendedor() {
	return emp_vendedor;
}
public void setEmp_vendedor(int empVendedor) {
	emp_vendedor = empVendedor;
}
public int getCd_vendedor() {
	return cd_vendedor;
}
public void setCd_vendedor(int cdVendedor) {
	cd_vendedor = cdVendedor;
}
public String getCd_localizador() {
	return cd_localizador;
}
public void setCd_localizador(String cdLocalizador) {
	cd_localizador = cdLocalizador;
}
public String getNm_localizador() {
	return nm_localizador;
}
public void setNm_localizador(String nmLocalizador) {
	nm_localizador = nmLocalizador;
}
public String getAtivo() {
	return ativo;
}
public void setAtivo(String ativo) {
	this.ativo = ativo;
}
public Timestamp getCadastrado() {
	return cadastrado;
}
public void setCadastrado(Timestamp cadastrado) {
	this.cadastrado = cadastrado;
}
public Timestamp getAtualizado() {
	return atualizado;
}
public void setAtualizado(Timestamp atualizado) {
	this.atualizado = atualizado;
}

}[/code]

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/intecibr</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

      
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>


        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <!-- Names the annotated entity class -->
		<mapping class="br.com.intec.mobile.persistence.amk_bairro" />
		<mapping class="br.com.intec.mobile.persistence.amk_campos_add" />
		<mapping class="br.com.intec.mobile.persistence.amk_cidade" />
		<mapping class="br.com.intec.mobile.persistence.amk_contato" />
		<mapping class="br.com.intec.mobile.persistence.amk_convite" />	
		<mapping class="br.com.intec.mobile.persistence.amk_email" />
		<mapping class="br.com.intec.mobile.persistence.amk_endereco" />
		<mapping class="br.com.intec.mobile.persistence.amk_fone" /> 	
		<mapping class="br.com.intec.mobile.persistence.amk_pesquisa" />
		<mapping class="br.com.intec.mobile.persistence.amk_vendedor" />
		

    </session-factory>

Para estas duas propriedades

private Timestamp cadastrado; private Timestamp atualizado;
Você deve incluir a annotation @Temporal e indicar o tipo DATE, Time ou Timestamp

@Temporal(TemporalType.TIMESTAMP) - Data e hora
@Temporal(TemporalType.TIME) - Somente hora
@Temporal(TemporalType.DATE) - Somenta data

Tenta ai

Pois é cara inclui as Annotations, porém um outro lance ocorreu:

Como pode ver no Xml, o esquema da base está definido para atualizar quando for inicializado, neste momento ele me lança essa excessão:

Exception in thread “main” java.lang.ExceptionInInitializerError
at br.com.intec.mobile.main.CriaTabela.main(CriaTabela.java:22)
Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: br.com.intec.mobile.persistence.amk_vendedor.atualizado
at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:93)
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:120)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1667)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at br.com.intec.mobile.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:11)
at br.com.intec.mobile.util.HibernateUtil.(HibernateUtil.java:8)

Verdade, havia me esquecido.
Então, o que pode estar ocorrendo é você estar usando o Timestamp do pacote java.util, que é diferente do Timestamp do java.sql…
Das duas uma, ou muda para Date e mantém o temporal, ou muda para Timestamp do java.sql…

private Timestamp cadastrado;  
private Timestamp atualizado;
//Altera por
private Date cadastrado;  
private Date atualizado;
// OU
private Calendar cadastrado;  
private Calendar atualizado;

Pois é cara pensei nessa possibilidade de estar importando errado, mas estou importando justamente o java.sql… que Zica rs…

No caso o com DATE eu trabalharia apenas com a data e sem as horas correto ???

Não. O Date tem todos os campos.

Date d = new Date();
      System.out.println(d);

A saída é

Wed Jun 01 10:40:32 BRT 2011

Fica até mais fácil de formatar depois…

vc pode trabalhar com todos os tipos que o Date te da, nome do dia da semana, ano, localização, mes…
depende da formatação que vc queira…

 Date data = new Date();
 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
 System.out.println(sdf.format(data));

Po cara muito estranho de todas as formas que tento por aqui ele não aceita, tanto com Calendar, Date ou TimeStamp

Com o Date


@Temporal(TemporalType.DATE)
private Date cadastrado;
@Temporal(TemporalType.DATE)
private Date atualizado;

Exception in thread “main” java.lang.ExceptionInInitializerError
at br.com.intec.mobile.main.CriaTabela.main(CriaTabela.java:22)
Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: br.com.intec.mobile.persistence.amk_vendedor.atualizado
at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:93)
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:120)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1667)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at br.com.intec.mobile.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:11)
at br.com.intec.mobile.util.HibernateUtil.(HibernateUtil.java:8)

Se eu mudar o tipo para Calendar, consigo dar um update na base porém obtenho a mesma resposta quando tento listar:

INFO: could not read column value from result set: atualizado9_0_; Cannot convert value ‘0000-00-00 00:00:00’ from column 3 to TIMESTAMP.
01/06/2011 11:03:46 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 0, SQLState: S1009
01/06/2011 11:03:46 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Cannot convert value ‘0000-00-00 00:00:00’ from column 3 to TIMESTAMP.

Será que a forma que estou tentando listar tem alguma influência ???

O date é do java.sql ou do java.util?

cara vc pode fazer como String mesmo…
eu fiz aqui em um projeto e funcionou blz…

@Transient
private SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
private String dataRegistro = formatador.format(new Date());

O Date é do java.sql

JonaThan desculpa cara, sou iniciante ainda, poderia me explicar um pouco melhor o método que usou?

Ele precisa ser do java.util

No Mysql você deve setar seu campo com o tipo datetime. E no mapeamento do hibernate mantém como timestamp.

O Date é do java.sql

JonaThan desculpa cara, sou iniciante ainda, poderia me explicar um pouco melhor o método que usou?[/quote]
sim, sem problemas, se o sua dificuldade é inserir uma data no banco de dados, vc pode utilizar do tipo String mesmo…
o código

private SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");  

formata para dia/mes/ano uma data

private String dataRegistro = formatador.format(new Date()); 

aqui vc cria uma string que vai receber a data de hoje por exemplo, só que formatando em dia/mes/ano

@Transient  
private SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");  
private String dataRegistro = formatador.format(new Date()); 

e esse @Transient é para ele não incluir este campo na tabela quando vc gerar o banco de dados…
quando vc for incluir algum registro, ele automaticamente vai pegar a data de hoje a adicionar no banco para vc

Cara devo estar numa zica danada mesmo, nada que tentamos até agora deu certo… rsrs

Olha só ao tentar usar o método que o Jhonatham passou, obtive a mesma resposta de que não converter 0000-00-00 00:00:00 …

E ao mudar o tipo do date para o java.util

Recebi a seguinte resposta:

01/06/2011 11:27:45 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: atualizado9_0_; Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Date
01/06/2011 11:27:45 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 0, SQLState: S1009
01/06/2011 11:27:45 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Date

Que zica é essa rsrs, mais alguma alternativa brothers???

pega esse import

import java.util.Date;

e tenta de novo com o que eu te passei pq se aqui deu certo ae vai ter que dar tmb!
=]

Po cara… tá ai forma como declarei

e ainda assim não ta rolando;

[code]package br.com.intec.mobile.persistence;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class amk_vendedor {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int cd;
private int emp_vendedor;
private int cd_vendedor;
private String cd_localizador;
private String nm_localizador;
private String ativo;
@Transient
private SimpleDateFormat formatador = new SimpleDateFormat("dd/mm/yyyy  hh:mm:ss");
private String cadastrado = formatador.format(new Date());
@Transient
private SimpleDateFormat formatador2 = new SimpleDateFormat("dd/mm/yyyy  hh:mm:ss");
private String atualizado = formatador2.format(new Date());

/*
@Temporal(TemporalType.DATE)
private Date cadastrado;
@Temporal(TemporalType.DATE)
private Date atualizado; */

public int getCd() {
	return cd;
}
public void setCd(int cd) {
	this.cd = cd;
}
public int getEmp_vendedor() {
	return emp_vendedor;
}
public void setEmp_vendedor(int empVendedor) {
	emp_vendedor = empVendedor;
}
public int getCd_vendedor() {
	return cd_vendedor;
}
public void setCd_vendedor(int cdVendedor) {
	cd_vendedor = cdVendedor;
}
public String getCd_localizador() {
	return cd_localizador;
}
public void setCd_localizador(String cdLocalizador) {
	cd_localizador = cdLocalizador;
}
public String getNm_localizador() {
	return nm_localizador;
}

public void setNm_localizador(String nmLocalizador) {
	nm_localizador = nmLocalizador;
}
public String getAtivo() {
	return ativo;
}
public void setAtivo(String ativo) {
	this.ativo = ativo;
}
public SimpleDateFormat getFormatador() {
	return formatador;
}
public void setFormatador(SimpleDateFormat formatador) {
	this.formatador = formatador;
}
public String getCadastrado() {
	return cadastrado;
}
public void setCadastrado(String cadastrado) {
	this.cadastrado = cadastrado;
}
public SimpleDateFormat getFormatador2() {
	return formatador2;
}
public void setFormatador2(SimpleDateFormat formatador2) {
	this.formatador2 = formatador2;
}
public String getAtualizado() {
	return atualizado;
}
public void setAtualizado(String atualizado) {
	this.atualizado = atualizado;
}
/*public Date getCadastrado() {
	return cadastrado;
}
public void setCadastrado(Date cadastrado) {
	this.cadastrado = cadastrado;
}
public Date getAtualizado() {
	return atualizado;
}
public void setAtualizado(Date atualizado) {
	this.atualizado = atualizado; 
}
*/

}[/code]

Vou tentar também a alternativa do Romarcio;