À quoi sert l'annotation @Temporal dans Hibernate?

101

La documentation Hibernate contient les informations ci-dessous pour l' @Temporalannotation:

Dans les API Java simples, la précision temporelle de l'heure n'est pas définie. Lorsque vous traitez des données temporelles, vous souhaiterez 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.

Que veut temporal precision of time is not defineddire? Qu'est-ce que la temporaldonnée et sa précision? Comment s'accorde-t-il?

Chaitanya
la source
3
Si vous utilisez Calendar comme propriété d'entité, en java brut, il imprime beaucoup d'informations qui ne sont pas nécessaires lorsque vous voulez les enregistrer dans la base de données, par exemple.Dans ce cas, vous pouvez avoir quelque chose comme @Temporal (TemporalType.TIMESTAMP) Calendrier de calendrier dans votre entité pour stocker l'horodatage dans votre base de données ou uniquement la date ou l'heure en remplaçant @Temporal (TemporalType.DATE) ou @Temporal (TemporalType.TIME) sur votre propriété de calendrier.
user3487063

Réponses:

104

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

L' Temporalannotation peut être utilisée conjointement avec l' Basicannotation, l' Idannotation ou l' ElementCollectionannotation (lorsque la valeur de la collection d'élément est d'un tel type temporel.

Dans les API Java simples, la précision temporelle de l'heure n'est pas définie. Lorsque vous traitez des données temporelles, vous souhaiterez 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' @Temporalannotation 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 la base de données.

La précision temporelle n'est pas spécifiée dans les API Java principales. @Temporalest une JPAannotation qui convertit dans les deux sens entre horodatage et java.util.Date. Il se convertit également time-stampen 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;

Selon javadocs,

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

[Informations ci-dessus recueillies auprès de diverses sources]

Ankur Singhal
la source
Pourquoi ne puis-je pas l'utiliser avec l'horodatage de type Java?
poudre366
3
Donc, si vous utilisez simplement TemporalType.TIMESTAMP ... est-il utile d'utiliser cette annotation? Les dates semblent bien fonctionner à cette fin sans cela ..
Amalgovinus
comment je peux stocker dans MySql DB au format commeyyyy-MM-dd
Shantaram Tupe
@shantaram_t cela pourrait vous aider
Ankur Singhal
1
J'ai une entrée: 02/10/2017et je veux le convertir en 2017-10-02ou2017/10/02
Shantaram Tupe
42

@Temporal est une annotation JPA qui peut être utilisée pour stocker dans la table de base de données l'un des éléments de colonne suivants:

  1. DATE ( java.sql.Date)
  2. HEURE ( java.sql.Time)
  3. HORAIRE ( java.sql.Timestamp)

Généralement, lorsque nous déclarons un Datechamp dans la classe et essayons de le stocker.
Il sera stocké en tant que TIMESTAMP dans la base de données.

@Temporal
private Date joinedDate;

Le code ci-dessus stockera la valeur comme 08-07-17 04: 33: 35.870000000 PM

Si nous voulons stocker uniquement la DATE dans la base de données,
nous pouvons utiliser / définir TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

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

Il existe également d'autres attributs @Temporalqui peuvent être utilisés en fonction de l'exigence.

Avikool91
la source
La valeur par défaut est TemporalType.DATE. Vous ne savez pas pourquoi vous avez fourni une valeur d'attribut non annotée avec une partie de temps.
Simon Logic
si deux dates y sont identiques par volonté, l'aspect ci-dessus fonctionne (TemporalType.DATE).
Lova Chittumuri
Ne copiez pas collez la réponse. stackoverflow.com/questions/25333711/…
Lova Chittumuri
10

Les types temporels sont l'ensemble des types basés sur le temps qui peuvent être utilisés dans les mappages d'états persistants.

La liste des types temporels pris en charge comprend les trois java.sqltypes java.sql.Date, java.sql.Timeet java.sql.Timestamp, et il comprend les deux java.utiltypes java.util.Dateetjava.util.Calendar .

Les java.sqltypes sont totalement sans tracas. Ils agissent comme n'importe quel autre type de mappage simple et ne nécessitent aucune considération particulière.

java.utilCependant, les deux types nécessitent des métadonnées supplémentaires pour indiquer le java.sqltype JDBC à utiliser lors de la communication avec le pilote JDBC. Cela se fait en les annotant avec l' @Temporalannotation et en spécifiant le type JDBC comme valeur du TemporalTypetype énuméré.

Il existe trois valeurs énumérées DATE, TIME et TIMESTAMP pour représenter chacun des java.sqltypes.

Montaser Mahadi
la source
4

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;
}
Ganesh Giri
la source
4

Si vous cherchez une réponse courte:

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

Source: Baeldung

skryvets
la source
3

J'utilise Hibernate 5.2 et ce @Temporaln'est plus nécessaire.
java.util.date , sql.date , time.LocalDate sont stockés dans la base de données avec le type de données approprié comme date / horodatage.

Arun Raaj
la source
alors quelle est la solution si nous voulons seulement enregistrer la date en utilisant Hibernate 5.x
Kms
Utilisation de Java 8 LocalDate
Josh
1

Nous utilisons l'annotation @Temporal pour insérer la date, l'heure ou les deux dans la table de base de données.En utilisant TemporalType, nous pouvons insérer des données, l'heure ou les deux table int.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Samim Hossain
la source