• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

Erros JPA – org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: [package].[classe]

March 8, 2021 by Mauda Leave a Comment

Conteúdo do Post:
  1. Descrição do Erro
  2. Solução
  3. finally{

Olá Pessoal, tudo bom?

Hoje iremos falar sobre um erro de Mapeamento de Entidades JPA, mais especificamente da exception @Temporal should only be set on a java.util.Date or java.util.Calendar property: [package].[classe].

Descrição do Erro

Nas versões mais recentes das bibliotecas de ORM como Hibernate, Eclipse Link, já existe a habilidade de realizar o mapeamento de classes na nova API do java de Data e Hora  (Java Time). O problema é que se você está realizando uma atualização de versão, como por exemplo, estava na versão 4 do Hibernate e foi para a 5, pode ser que foi realizada a alteração dos atributos do tipo Date ou Calendar para as classes LocalDate, LocalTime e LocalDateTime, por exemplo.

Mas quando houve a atualização foi esquecido de remover a annotation @Temporal. Essa annotation irá causar o erro. Assim, vamos supor o seguinte exemplo do código abaixo antes da alteração do atributo data para a classe LocalDate:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package br.com.mauda.seminario.cientificos.model;
 
import java.util.Date;
 
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name = "TB_SEMINARIO")
public class Seminario implements DataValidation, Serializable {
 
    @Temporal(TemporalType.DATE)
    private Date data;
    
    //Outros atributos e metodos foram omitidos
}

 

Agora vamos realizar a atualização do tipo do atributo, mas sem remover a annotation:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package br.com.mauda.seminario.cientificos.model;
 
import java.time.LocalDate;
 
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name = "TB_SEMINARIO")
public class Seminario implements DataValidation, Serializable {
 
    @Temporal(TemporalType.DATE)
    private LocalDate data;
    
    //Outros atributos e metodos foram omitidos
}

 

Essa annotation @Temporal no mapeamento da LocalDate causa a exception de mapeamento:

org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: br.com.mauda.seminario.cientificos.model.Seminario.data
at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:172)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:189)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:205)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2166)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:895)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:728)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3568)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3522)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1379)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1784)
at br.com.mauda.seminario.cientificos.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:26)

 

Solução

A solução aqui é bem simples, após realizar a troca do tipo para uma das classes da API Java Time, basta remover a annotation @Temporal. Como as classes da Java Time já estão bem desenvolvidas para lidar com os tipos de Datas e Horas tornando mais fácil o trabalho para o JPA/Hibernate. Dessa forma nosso código final ficou assim:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package br.com.mauda.seminario.cientificos.model;
 
import java.time.LocalDate;
 
import javax.persistence.Entity;
import javax.persistence.Table;
 
@Entity
@Table(name = "TB_SEMINARIO")
public class Seminario implements DataValidation, Serializable {
 
    private LocalDate data;
    
    //Outros atributos e metodos foram omitidos
}

 

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 artigo!

Filed Under: Java, JDK 8, JPA Tagged With: Hibernate, Java, Java 8, java.time, JPA, Temporal

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in