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;