[RESOLVIDO]Hibernate não consegue ler Timestamp?

24 respostas
L

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 ???

24 Respostas

drsmachado

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

L

Beleza vamos lá

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;
	}
}
<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>
drsmachado

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

L

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)
drsmachado

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…

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

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 ???

drsmachado

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…

JonaTHANNM

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));
L

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 ???

drsmachado

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

JonaTHANNM

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());
L

O Date é do java.sql

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

drsmachado

Ele precisa ser do java.util

romarcio

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

JonaTHANNM

O Date é do java.sql

JonaThan desculpa cara, sou iniciante ainda, poderia me explicar um pouco melhor o método que usou?
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

L

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???

JonaTHANNM

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!
=]

L

Po cara... tá ai forma como declarei

e ainda assim não ta rolando;

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; 
	}
	*/
	
	
	
		
}

Vou tentar também a alternativa do Romarcio;

L

Pô o dia inteiro tentanto resolver essa parada ae, e não consegui sair do lugar…

Caso alguém lembre de alguma outra alternativa, por favor, me avise ae valeu ???

Obrigado

romarcio

O que a final você não consegue fazer?

Salvar uma data?
Fazer uma pesquisa na tabela?

L

Cara, estava com problema ao ler a data.

O método iniciava a leitura, porém quando encontrava campos que estavam preenchidos com 0000-00-00 00:00:00 ele lançava um erro dizendo que não poderia converter esse valor.

Mas ao limpar a base e deixar apenas com data e hora preenchidas ele funcionou corretamente.

Problema resolvido, mas duvida não esclarecida, qual é o problema que ele não consegue trazer esses campos “zerados”???

Por que ele tenta converter ???

romarcio
LeandroMario:
Cara, estava com problema ao ler a data.

O método iniciava a leitura, porém quando encontrava campos que estavam preenchidos com 0000-00-00 00:00:00 ele lançava um erro dizendo que não poderia converter esse valor.

Mas ao limpar a base e deixar apenas com data e hora preenchidas ele funcionou corretamente.

Problema resolvido, mas duvida não esclarecida, qual é o problema que ele não consegue trazer esses campos "zerados"???

Por que ele tenta converter ???

Agora entendi qual o problema. O Mysql tem um bug nesse sentido. Então a partir da versão 5 ou 5.1, eles resolveram da seguinte maneira, adicionando isso: ?zeroDateTimeBehavior=convertToNull na URL de conexão.
<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?zeroDateTimeBehavior=convertToNull</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>

Espero que ajude.

L

Po Romarcio, ajudou sim, e bastante ainda… Caso eu já soubesse desse bug, teria poupado varias horas de dor de cabeça… Valeu Brother, Obrigado!

Criado 1 de junho de 2011
Ultima resposta 3 de jun. de 2011
Respostas 24
Participantes 4