What is the use of the @Temporal annotation in Hibernate?

JavaHibernate

Java Problem Overview


The Hibernate Documentation has the information below for the @Temporal annotation:

> In plain Java APIs, the temporal precision of time is not defined. > When dealing with temporal data you might want to describe the > expected precision in database. Temporal data can have DATE, TIME, or > TIMESTAMP precision (ie the actual date, only the time, or both). Use > the @Temporal annotation to fine tune that.

What does temporal precision of time is not defined mean? What is temporal data and its precision? How does it fine tune?

Java Solutions


Solution 1 - Java

This annotation must be specified for persistent fields or properties of type java.util.Date and java.util.Calendar. It may only be specified for fields or properties of these types.

The Temporal annotation may be used in conjunction with the Basic annotation, the Id annotation, or the ElementCollection annotation (when the element collection value is of such a temporal type.

In plain Java APIs, the temporal precision of time is not defined. When dealing with temporal data, you might want to describe the expected precision in database. Temporal data can have DATE, TIME, or TIMESTAMP precision (i.e., the actual date, only the time, or both). Use the @Temporal annotation to fine tune that.

The temporal data is the data related to time. For example, in a content management system, the creation-date and last-updated date of an article are temporal data. In some cases, temporal data needs precision and you want to store precise date/time or both (TIMESTAMP) in database table.

The temporal precision is not specified in core Java APIs. @Temporal is a JPA annotation that converts back and forth between timestamp and java.util.Date. It also converts time-stamp into time. For example, in the snippet below, @Temporal(TemporalType.DATE) drops the time value and only preserves the date.

@Temporal(TemporalType.DATE)
private java.util.Date creationDate;

As per javadocs,

> Annotation to declare an appropriate {@code TemporalType} on query > method parameters. Note that this annotation can only be used on > parameters of type {@link Date} with default TemporalType.DATE

[Information above collected from various sources]

Solution 2 - Java

@Temporal is a JPA annotation which can be used to store in the database table on of the following column items:

  1. DATE (java.sql.Date)
  2. TIME (java.sql.Time)
  3. TIMESTAMP (java.sql.Timestamp)

Generally when we declare a Date field in the class and try to store it.
It will store as TIMESTAMP in the database.

@Temporal
private Date joinedDate;

Above code will store value looks like 08-07-17 04:33:35.870000000 PM

If we want to store only the DATE in the database,
We can use/define TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

This time, it would store 08-07-17 in database

There are some other attributes as well as @Temporal which can be used based on the requirement.

Solution 3 - Java

Temporal types are the set of time-based types that can be used in persistent state mappings.

The list of supported temporal types includes the three java.sql types java.sql.Date, java.sql.Time, and java.sql.Timestamp, and it includes the two java.util types java.util.Date and java.util.Calendar.

The java.sql types are completely hassle-free. They act just like any other simple mapping type and do not need any special consideration.

The two java.util types need additional metadata, however, to indicate which of the JDBC java.sql types to use when communicating with the JDBC driver. This is done by annotating them with the @Temporal annotation and specifying the JDBC type as a value of the TemporalType enumerated type.

There are three enumerated values of DATE, TIME, and TIMESTAMP to represent each of the java.sql types.

Solution 4 - Java

use this

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;

public Calendar getCreateDate() {
    return createDate;
}
    
public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}

Solution 5 - Java

I use Hibernate 5.2 and @Temporal is not required anymore.
java.util.date, sql.date, time.LocalDate are stored into DB with appropriate datatype as Date/timestamp.

Solution 6 - Java

If you're looking for short answer:

In the case of using java.util.Date, Java doesn't really know how to directly relate to SQL types. This is when @Temporal comes into play. It's used to specify the desired SQL type.

Source: Baeldung

Solution 7 - Java

We use @Temporal annotation to insert date, time or both in database table.Using TemporalType we can insert data, time or both int table.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.

Solution 8 - Java

Simply, @Temporal is a Hibernate JPA annotation which should only be set on a java.util.Date or java.util.Calendar. It helps to convert the date and time values from Java object to compatible database type and will retrieve it back to the application.

supports;

@Temporal(TemporalType.TIMESTAMP)
@Temporal(TemporalType.DATE)
@Temporal(TemporalType.TIME)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChaitanyaView Question on Stackoverflow
Solution 1 - JavaAnkur SinghalView Answer on Stackoverflow
Solution 2 - JavaAvikool91View Answer on Stackoverflow
Solution 3 - JavaMontaser MahadiView Answer on Stackoverflow
Solution 4 - JavaGanesh GiriView Answer on Stackoverflow
Solution 5 - JavaArun RaajView Answer on Stackoverflow
Solution 6 - JavaskryvetsView Answer on Stackoverflow
Solution 7 - JavaMd. Samim hossainView Answer on Stackoverflow
Solution 8 - JavaIshView Answer on Stackoverflow