web-dev-qa-db-fra.com

Quelle est l'utilisation de l'annotation @Temporal dans Hibernate?

La documentation d'Hibernate contient les informations ci-dessous pour l'annotation @Temporal:

Dans les API Java simples, la précision temporelle du temps n'est pas définie . Lorsque vous traitez avec des données temporelles, vous voudrez peut-être décrire le fichier précision attendue dans la base de données. Les données temporelles peuvent avoir DATE, TIME ou Précision TIMESTAMP (c'est-à-dire la date réelle, uniquement l'heure ou les deux). Utilisation l'annotation @Temporal pour affiner cela.

Que signifie temporal precision of time is not defined? Que sont les données temporal et leur précision? Comment ça se règle?

70
Chaitanya

Cette annotation doit être spécifiée pour les champs persistants ou les propriétés de type Java.util.Date et Java.util.Calendar. Il ne peut être spécifié que pour les champs ou les propriétés de ces types.

L'annotation Temporal peut être utilisée conjointement avec l'annotation Basic, l'annotation Id ou l'annotation ElementCollection (lorsque la valeur de collection d'éléments est d'un tel type temporel. 

Dans les API Java simples, la précision temporelle du temps n'est pas définie. Lorsque vous traitez avec des données temporelles, vous voudrez peut-être décrire la précision attendue dans la base de données. Les données temporelles peuvent avoir une précision DATE, TIME ou TIMESTAMP (c'est-à-dire la date réelle, uniquement l'heure ou les deux). Utilisez l'annotation @Temporal pour affiner cela.

Les données temporelles sont les données liées au temps. Par exemple, dans un système de gestion de contenu, la date de création et la date de dernière mise à jour d'un article sont des données temporelles. Dans certains cas, les données temporelles ont besoin de précision et vous souhaitez stocker une date/heure précise ou les deux (TIMESTAMP) dans la table de base de données.

La précision temporelle n'est pas spécifiée dans les API Java principales. @Temporal est une annotation JPA qui effectue un va-et-vient entre timestamp et Java.util.Date. Il convertit également time-stamp en temps. Par exemple, dans l'extrait de code ci-dessous, @Temporal(TemporalType.DATE)supprime la valeur de l'heure et ne conserve que la date.

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

Comme javadocs,

Annotation pour déclarer un {@code TemporalType} approprié sur la requête paramètres de la méthode. Notez que cette annotation ne peut être utilisée que sur paramètres de type {@link Date} avec TemporalType.DATE par défaut

[Informations ci-dessus recueillies de diverses sources]

76
Ankur Singhal

@Temporalest une annotation JPA qui peut être utilisée pour stocker uniquement HEURE (Java.sql.Time), DATE (Java.sql.Date) ou HORODATAGE (Java.sql.Timestamp) dans le table de base de données. Généralement, lorsque nous déclarons un champ Date dans la classe et essayons de le stocker. Il va stocker l'horodatage dans la base de données.

private Date joinedDate;

la valeur stockée ressemble à 08-07-17 04: 33: 35.870000000 PM  

Si nous voulons stocker uniquement la date dans la base de données, nous pouvons utiliser cette annotation avec l'attribut DATE.

@Temporal(TemporalType.DATE)

private Date joinedDate;

Cette fois, il stockerait 08-07-17 dans la base de données

Il existe également d’autres attributs de @Temporal qui peuvent être utilisés en fonction des besoins.

16
Avikool91

Les types temporels sont l'ensemble des types temporels pouvant être utilisés dans les mappages d'états persistants. 

La liste des types temporels pris en charge comprend les trois types Java.sql, Java.sql.Date, Java.sql.Time et Java.sql.Timestamp, ainsi que les deux types Java.util, Java.util.Date et Java.util.Calendar.

Les types Java.sql sont totalement sans tracas. Ils agissent comme tout autre type de mappage simple et ne nécessitent aucune considération particulière. 

Cependant, les deux types Java.util nécessitent des métadonnées supplémentaires pour indiquer le type JDBC Java.sql à utiliser lors de la communication avec le pilote JDBC. Pour ce faire, annotez-les avec l'annotation @Temporal et spécifiez le type JDBC en tant que valeur du type énuméré TemporalType

Il existe trois valeurs énumérées: DATE, TIME et TIMESTAMP pour représenter chacun des types Java.sql.

8
Montaser Mahadi

utilisez ceci 

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

public Calendar getCreateDate() {
    return createDate;
}

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

J'utilise Hibernate 5.2 et @Temporal n'est plus requis.
Java.util.date , sql.date , time.LocalDate sont stockés dans une base de données avec le type de données approprié (date/timestamp). 

0
Arun Raaj

Si vous cherchez une réponse courte:

Dans le cas de l'utilisation de Java.util.Date, Java ne sait pas vraiment comment se connecter directement aux types SQL. C'est à ce moment que @Temporal entre en jeu. Il est utilisé pour spécifier le type SQL souhaité.

Source: Baeldung

0
skryvets