Olá Pessoal, tudo bom?
Hoje iremos falar sobre mais um erro de Mapeamento de Entidades JPA, mais especificamente da exception Wrong column type in TABLE for column COLUMN. Found: date, expected: timestamp.
Descrição do Erro
Ao mapear colunas que armazenam Data e Hora cria-se um atributo do tipo java.util.Date e a partir deste mapeamos para a coluna correspondente se o nome do atributo não for igual a coluna da tabela com a annotation @javax.persistence.Column, como no exemplo abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package br.com.mauda.example.model; import java.io.Serializable; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; private String nome; @Column(name="DT_ANIVERSARIO") private Date dataAniversario; public Artista(){ } //outros atributos, métodos e construtores } |
Como não utilizamos @javax.persistence.Temporal e com isso não definimos qual será o formato da Data no banco de dados, irá causar o seguinte erro apresentando pela stack trace:
org.hibernate.HibernateException: Wrong column type in PUBLIC.PUBLIC.TB_SEMINARIO for column data. Found: date, expected: timestamp
at org.hibernate.mapping.Table.validateColumns(Table.java:373)
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1305)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:512)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1797)
at br.com.mauda.seminariosCientificos.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:23)
at br.com.mauda.seminariosCientificos.dao.util.HibernateUtil.getSession(HibernateUtil.java:29)
… 35 more
Solução
Como já descrito acima, a solução para este erro é inserir a annotation javax.persistence.Temporal, com a javax.persistence.TemporalType setada. Mas nesse momento qual devemos escolher para inserir aqui. Você deverá visualizar o script da tabela do banco de dados para isso, ou ver as definições da coluna em algum database manager. No caso de uma data de aniversário não faz muito sentido termos um armazenamento das horas, minutos e segundos. Veja na tabela abaixo o comparativo entre os tipos de datas:
Tipo da Coluna | Descrição |
---|---|
Date | A coluna apenas irá armazenar data (dia, mes e ano) |
Time | A coluna apenas irá armazenar tempo (hora, minuto, segundo e milissegundo) |
Timestamp | A coluna irá armazenar data (dia, mes e ano) e tempo (hora, minuto, segundo e milissegundo) |
No nosso caso utilizaremos Date, conforme mostra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package br.com.mauda.example.model; import java.io.Serializable; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; private String nome; @Temporal(TemporalType.DATE) @Column(name="DT_ANIVERSARIO") private Date dataAniversario; public Artista(){ } //outros atributos, métodos e construtores } |
finally{
Caso você achou mais alguma solução para essa exception, por favor deixe nos comentários abaixo!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply