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:
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:
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:
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!
Leave a Reply