Close

JPA - Persisting java.util.Date and java.util.Calendar using @Temporal Annotation

[Last Updated: Aug 4, 2020]

@Temporal annotation must be specified for persistent fields or properties of type java.util.Date and java.util.Calendar.

This annotation is defined as:

package javax.persistence;
  ........
public @interface Temporal {
   TemporalType value();
}

where TemporalType enum is defined as:

package javax.persistence;
...
public enum TemporalType {
     DATE,//Map as java.sql.Date
     TIME,//Map as java.sql.Time
     TIMESTAMP// Map as java.sql.Timestamp
}

Since java.util.Date and java.util.Calendar are not compatible to the standard SQL date types (DATE, TIME, TIMESTAMP), we must use @Temporal on these types and should specify the TemporalType for intended conversion.

Example

Entity

@Entity
public class ScheduledEvent {
  @Id
  @GeneratedValue
  private long id;
  private String eventName;

  @Temporal(TemporalType.DATE)
  private Date date;

  @Temporal(TemporalType.TIME)
  private Date start;

  @Temporal(TemporalType.TIME)
  private Date end;

  @Temporal(TemporalType.TIMESTAMP)
  private Date eventCreated;
    .............
}
public class ExampleMain {
  private static EntityManagerFactory entityManagerFactory =
          Persistence.createEntityManagerFactory("example-unit");

  public static void main(String[] args) {
      try {
          persistEvent();
          findEvent();
          nativeQuery("select CONCAT('start= ', e.start, '\nend= ', e.end, '\ndate= ', e.date,"
                   +"'\neventCreated= ', e.eventCreated)"
                  + " from ScheduledEvent e");
      } finally {
          entityManagerFactory.close();
      }
  }

  private static void persistEvent() {
      ScheduledEvent scheduledEvent = ScheduledEvent.create("Test event",
              LocalDate.of(2018, 6, 1),
              LocalTime.of(9, 30, 45),
              LocalTime.of(11, 45, 30));
      System.out.println("-- persisting entity --");
      System.out.println(scheduledEvent);
      EntityManager em = entityManagerFactory.createEntityManager();
      em.getTransaction().begin();
      em.persist(scheduledEvent);
      em.getTransaction().commit();
      em.close();
  }

  private static void findEvent() {
      System.out.println("-- finding entity --");
      EntityManager em = entityManagerFactory.createEntityManager();
      ScheduledEvent scheduledEvent = em.find(ScheduledEvent.class, 1L);
      System.out.println(scheduledEvent);
      em.close();
  }

  public static void nativeQuery(String s) {
      EntityManager em = entityManagerFactory.createEntityManager();
      System.out.println("-- native query --");
      Query query = em.createNativeQuery(s);
      List list = query.getResultList();
      for (Object o : list) {
          if (o instanceof Object[]) {
              System.out.println(Arrays.toString((Object[]) o));
          } else {
              System.out.println(o);
          }
      }
      em.close();
  }
}
-- persisting entity --
ScheduledEvent{id=0, eventName='Test event', date=Fri Jun 01 00:00:00 CDT 2018, start=Wed Dec 31 09:30:45 CST 2, end=Wed Dec 31 11:45:30 CST 2, eventCreated=Sun Jun 10 21:01:58 CDT 2018}
-- finding entity --
ScheduledEvent{id=1, eventName='Test event', date=2018-06-01, start=09:30:45, end=11:45:30, eventCreated=2018-06-10 21:01:58.265}
-- native query --
start= 09:30:45
end= 11:45:30
date= 2018-06-01
eventCreated= 2018-06-10 21:01:58.265

Example Project

Dependencies and Technologies Used:

  • h2 1.4.197: H2 Database Engine.
  • hibernate-core 5.2.13.Final: The core O/RM functionality as provided by Hibernate.
    Implements javax.persistence:javax.persistence-api version 2.1
  • JDK 1.8
  • Maven 3.3.9

@Temporal Annotation Example Select All Download
  • jpa-temporal-annotation
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ScheduledEvent.java
          • resources
            • META-INF

    See Also