¿Cuál es el uso de la anotación @Temporal en Hibernate?

101

La documentación de Hibernate tiene la siguiente información para la @Temporalanotación:

En las API de Java simples, la precisión temporal del tiempo no está definida. Al tratar con datos temporales, es posible que desee describir la precisión esperada en la base de datos. Los datos temporales pueden tener precisión DATE, TIME o TIMESTAMP (es decir, la fecha real, solo la hora o ambas). Use la anotación @Temporal para ajustar eso.

¿Qué temporal precision of time is not definedsignifica? ¿Qué son los temporaldatos y su precisión? ¿Cómo se afina?

Chaitanya
fuente
3
Si usa Calendar como su propiedad de Entidad, entonces en Java simple imprime mucha información que no es necesaria cuando desea guardarla en la base de datos, por ejemplo. En ese caso, puede tener algo como @Temporal (TemporalType.TIMESTAMP) Calendar calendar en su entidad para almacenar la marca de tiempo en su base de datos o solo la fecha o solo la hora cambiando a @Temporal (TemporalType.DATE) o @Temporal (TemporalType.TIME) en su propiedad Calendar.
user3487063

Respuestas:

104

Esta anotación debe especificarse para campos persistentes o propiedades de tipo java.util.Datey java.util.Calendar. Solo se puede especificar para campos o propiedades de este tipo.

La Temporalanotación se puede utilizar junto con la Basicanotación, la Idanotación o la ElementCollectionanotación (cuando el valor de la colección de elementos es de ese tipo temporal.

En las API de Java simples, la precisión temporal del tiempo no está definida. Cuando se trata de datos temporales, es posible que desee describir la precisión esperada en la base de datos. Los datos temporales pueden tener precisión DATE, TIME o TIMESTAMP (es decir, la fecha real, solo la hora o ambas). Use la @Temporalanotación para ajustar eso.

Los datos temporales son los datos relacionados con el tiempo. Por ejemplo, en un sistema de gestión de contenido, la fecha de creación y la fecha de última actualización de un artículo son datos temporales. En algunos casos, los datos temporales necesitan precisión y desea almacenar la fecha / hora precisa o ambas ( TIMESTAMP) en la tabla de la base de datos.

La precisión temporal no se especifica en las API principales de Java. @Temporales una JPAanotación que se convierte de un lado a otro entre la marca de tiempo y java.util.Date. También se convierte time-stampen tiempo. Por ejemplo, en el fragmento siguiente, @Temporal(TemporalType.DATE) elimina el valor de tiempo y solo conserva la fecha .

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

Según javadocs,

Anotación para declarar un {@code TemporalType} apropiado en los parámetros del método de consulta. Tenga en cuenta que esta anotación solo se puede utilizar en parámetros de tipo {@link Date} con valores predeterminadosTemporalType.DATE

[Información anterior recopilada de varias fuentes]

Ankur Singhal
fuente
¿Por qué no puedo usarlo con la marca de tiempo de tipo Java?
powder366
3
Entonces, si solo está usando TemporalType.TIMESTAMP ... ¿tiene algún sentido usar esta anotación? Las fechas parecen funcionar bien para este fin sin él ..
Amalgovinus
cómo puedo almacenar en MySql DB en el formato comoyyyy-MM-dd
Shantaram Tupe
@shantaram_t esto podría ayudarte
Ankur Singhal
1
Tengo una entrada: 02/10/2017y quiero convertirlo a 2017-10-02o2017/10/02
Shantaram Tupe
42

@Temporal es una anotación JPA que se puede utilizar para almacenar en la tabla de la base de datos uno de los siguientes elementos de columna:

  1. FECHA ( java.sql.Date)
  2. HORA ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

Generalmente cuando declaramos un Datecampo en la clase e intentamos almacenarlo.
Se almacenará como TIMESTAMP en la base de datos.

@Temporal
private Date joinedDate;

El código anterior almacenará el valor que se ve como 08-07-17 04: 33: 35.870000000 PM

Si queremos almacenar solo la FECHA en la base de datos,
podemos usar / definir TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Esta vez, almacenaría 08-07-17 en la base de datos

Hay algunos otros atributos, además de los @Temporalque se pueden utilizar según el requisito.

Avikool91
fuente
El valor predeterminado es TemporalType.DATE. No tiene idea de por qué ha proporcionado un valor de atributo sin anotaciones con una parte de tiempo.
Simon Logic
si dos fechas son iguales, el aspecto anterior está funcionando (TemporalType.DATE).
Lova Chittumuri
No copiar Pegue la respuesta. stackoverflow.com/questions/25333711/…
Lova Chittumuri
10

Los tipos temporales son el conjunto de tipos basados ​​en el tiempo que se pueden usar en asignaciones de estado persistentes.

La lista de tipos soportados temporales incluye los tres java.sqltipos java.sql.Date, java.sql.Timey java.sql.Timestamp, e incluye los dos java.utiltipos java.util.Datey java.util.Calendar.

Los java.sqltipos son completamente sencillos. Actúan como cualquier otro tipo de mapeo simple y no necesitan ninguna consideración especial.

java.utilSin embargo, los dos tipos necesitan metadatos adicionales para indicar cuál de los java.sqltipos de JDBC se debe utilizar al comunicarse con el controlador JDBC. Esto se hace anotándolos con la @Temporalanotación y especificando el tipo JDBC como un valor del TemporalTypetipo enumerado.

Hay tres valores enumerados de DATE, TIME y TIMESTAMP para representar cada uno de los java.sqltipos.

Montaser Mahadi
fuente
4

utilizar este

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

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}
Ganesh Giri
fuente
4

Si busca una respuesta corta:

En el caso de usar java.util.Date, Java realmente no sabe cómo relacionarse directamente con los tipos de SQL. Aquí es cuando @Temporalentra en juego. Se utiliza para especificar el tipo de SQL deseado.

Fuente: Baeldung

Skryvets
fuente
3

Utilizo Hibernate 5.2 y @Temporalya no es necesario.
java.util.date , sql.date , time.LocalDate se almacenan en la base de datos con el tipo de datos apropiado como fecha / marca de tiempo.

Arun Raaj
fuente
entonces, ¿cuál es la solución si solo queremos guardar la fecha usando Hibernate 5.x
Kms
Uso de Java 8 LocalDate
Josh
1

Usamos la anotación @Temporal para insertar fecha, hora o ambas en la tabla de la base de datos. Usando TemporalType podemos insertar datos, hora o ambas int tabla.

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