Hibernate Date, Time and DateTime Mapping

In this tutorial we show how to work with java.lang.Date to store Date, Time and DateTime using Hibernate Annotations or XML Mappings. Hibernate allows various Java Date/Time classes to be mapped. Like the java.sql.Date, java.sql.Time or java.sql.Timestamp. But to avoid dependencies on the java.sql package, it’s common to use java.util or java.time Date/Time classes instead.

Maven Dependencies

We use Apache Maven to manage the projects dependencies. Add the following dependencies to your projects pom.xml file.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.4</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.3.Final</version>
</dependency>
hibernate-date-time-datetime-timestamp-example

Create Model Classes + Annotation Mappings

We can use the @Temporal annotation to specify the precision in which hibernate will save the date, time or timestamp. In the following java class we show you each type. If you’re interested in how these types will be saved in the database, you can immediately scroll to the bottom of the page to see the result.

  • TemporalType.DATE: maps the date as java.sql.Date.
  • TemporalType.TIME: maps the date as java.sql.Time.
  • TemporalType.TIMESTAMP: maps the date as java.sql.Timestamp.
package com.memorynotfound.hibernate;

import javax.persistence.*;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;

@Entity
public class DateAndTime {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Temporal(TemporalType.DATE)
    private Date date;
    @Temporal(TemporalType.TIME)
    private Date time;
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateTime;


    public DateAndTime() {
    }

    public DateAndTime(Date date, Date time, Date dateTime) {
        this.date = date;
        this.time = time;
        this.dateTime = dateTime;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Date getDateTime() {
        return dateTime;
    }

    public void setDateTime(Date dateTime) {
        this.dateTime = dateTime;
    }

    @Override
    public String toString() {
        return "DateAndTime{" +
                "id=" + id +
                ", date=" + date +
                ", time=" + time +
                ", dateTime=" + dateTime +
                '}';
    }
}

Hibernate HBM XML Mapping

If you prefer Hibernate XML HBM Mapping files over Annotations, you can use the equivalent hibernate xml mapping. This file is located in the src/main/resources folder and is named DateAndTime.hbm.xml.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.memorynotfound.hibernate.DateAndTime">

        <id name="id" type="java.lang.Integer">
            <generator class="identity" />
        </id>

        <property name="date" type="date"/>
        <property name="time" type="time"/>
        <property name="dateTime" type="timestamp"/>

    </class>
</hibernate-mapping>

Configure Hibernate Connection Properties

We can configure the database properties using the hibernate hibernate.cfg.xml file, located on the classpath in the src/main/resources folder.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <!-- database connection properties -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/datestore?serverTimezone=Europe/Brussels</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- show mysql queries output in console -->
        <property name="hibernate.show_sql">true</property>

        <!-- manage automatic database creation -->
        <property name="hibernate.hbm2ddl.auto">create-drop</property>

        <!-- add annotated resources here -->
        <mapping class="com.memorynotfound.hibernate.DateAndTime"/>

    </session-factory>
</hibernate-configuration>

HibernateUtil

This class is used to configure hibernate during startup and create a standalone SessionFactory.

package com.memorynotfound.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    public static void shutdown() {
        sessionFactory.close();
    }
}

Create app

Finally, we can test the application by creating a new object and setting the corresponding fields. When the object is persisted, we can see the result in the database.

package com.memorynotfound.hibernate;

import org.hibernate.Session;
import org.hibernate.Transaction;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class App {

    public static void main (String...args){

        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        Date now = new Date();

        DateAndTime date = new DateAndTime();
        date.setDate(now);
        date.setTime(now);
        date.setDateTime(now);

        session.save(date);
        tx.commit();

        List<DateAndTime> dateAndTimes = (List<DateAndTime>)session.createQuery("from DateAndTime").list();
        System.out.println(Arrays.toString(dateAndTimes.toArray()));

        session.close();
        HibernateUtil.shutdown();
    }
}

The previous application prints the following info to the console.

...
Hibernate: insert into DateAndTime (date, time, dateTime) values (?, ?, ?)
Hibernate: select dateandtim0_.id as id1_0_, dateandtim0_.date as date2_0_, dateandtim0_.time as time3_0_, dateandtim0_.dateTime as dateTime4_0_ from DateAndTime dateandtim0_
[DateAndTime{id=1, date=Mon Oct 24 11:34:49 CEST 2016, time=Mon Oct 24 11:34:49 CEST 2016, dateTime=Mon Oct 24 11:34:49 CEST 2016}]
...

Records inserted in the database

hibernate-date-time-datetime-timestamp-example-records

References

Download

You may also like...