Hibernate : How to use @Temporal annotation

Points To Remember

@Temporal annotation must be used with the persistent fields or properties of type

  • java.util.Date 
  • java.util.Calendar

How to use @Temporal annotation

@Temporal Annotation is defined as following

@Target({ METHOD, FIELD })
@Retention(RUNTIME)
public @interface Temporal {
 /**
  * The type used in mapping <code>java.util.Date</code> or <code>java.util.Calendar</code>.
  */
 TemporalType value();
}

So the TemporalType is an Enum and looks like following
public enum TemporalType {
 DATE,
 TIME,
 TIMESTAMP
}
So @Temporal annotation can take three values DATE, TIME and TIMESTAMP. And it will create the following database ddl type.

TemporalTypeDatabase DDL Type
DATEdate
TIMESTAMPdatetime
TIMEtime

If we the following class as Hibernate Entity

package com.ekiras.domian;

import javax.persistence.*;
import java.util.Date;

@Entity
public class User {

    @Id
    @SequenceGenerator(name = "test")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "test")
    private Long id;

    @Temporal(value = TemporalType.DATE)
    private Date dateCreated1;

    @Temporal(value = TemporalType.TIMESTAMP)
    private Date dateCreated2;


    @Temporal(value = TemporalType.TIME)
    private Date dateCreated3;

    // GETTERS and SETTERS
}

It will create the output as shown in the image below.


If we try to add @Temporal annotation to any other field other than of type Date and Calender we will get the following exception

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: com.ekiras.domian.User.name
 at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:182)
 at org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(Propertyjava:195)
 at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:216)
 at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2241)
 at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963)
 at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796)
 at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
 at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
 at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
 at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
 ... 23 more

No comments :

Post a Comment