Qual è l'uso dell'annotazione @Temporal in Hibernate?


101

La documentazione di Hibernate contiene le informazioni seguenti per l' @Temporalannotazione:

Nelle semplici API Java, la precisione temporale del tempo non è definita. Quando si tratta di dati temporali, è possibile descrivere la precisione prevista nel database. I dati temporali possono avere una precisione DATE, TIME o TIMESTAMP (ovvero la data effettiva, solo l'ora o entrambe). Usa l'annotazione @Temporal per ottimizzarlo.

Cosa temporal precision of time is not definedsignifica? Cosa sono i temporaldati e la loro precisione? Come funziona la sintonizzazione?


3
Se usi Calendar come proprietà Entity, in java semplice stampa molte informazioni che non sono necessarie quando vuoi salvarle nel database, ad esempio.In tal caso, puoi avere qualcosa come @Temporal (TemporalType.TIMESTAMP) Calendario calendario nella tua entità per memorizzare il timestamp nel tuo database o solo la data o solo l'ora cambiando in @Temporal (TemporalType.DATE) o @Temporal (TemporalType.TIME) nella tua proprietà Calendar.
user3487063

Risposte:


104

Questa annotazione deve essere specificata per i campi persistenti o le proprietà di tipo java.util.Datee java.util.Calendar. Può essere specificato solo per campi o proprietà di questi tipi.

L' Temporalannotazione può essere utilizzata insieme Basicall'annotazione, Idall'annotazione o ElementCollectionall'annotazione (quando il valore della raccolta di elementi è di un tale tipo temporale.

Nelle semplici API Java, la precisione temporale del tempo non è definita. Quando si tratta di dati temporali, è possibile descrivere la precisione prevista nel database. I dati temporali possono avere una precisione DATE, TIME o TIMESTAMP (cioè la data effettiva, solo l'ora o entrambe). Usa l' @Temporalannotazione per perfezionarlo.

I dati temporali sono i dati relativi al tempo. Ad esempio, in un sistema di gestione dei contenuti, la data di creazione e la data di ultimo aggiornamento di un articolo sono dati temporali. In alcuni casi, i dati temporali richiedono precisione e si desidera memorizzare data / ora precise o entrambi (TIMESTAMP ) nella tabella del database.

La precisione temporale non è specificata nelle API Java principali. @Temporalè JPAun'annotazione che converte avanti e indietro tra timestamp e java.util.Date. Inoltre si converte time-stampin tempo. Ad esempio, nello snippet di seguito, @Temporal(TemporalType.DATE) elimina il valore dell'ora e conserva solo la data .

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

Secondo javadocs,

Annotazione per dichiarare un {@code TemporalType} appropriato sui parametri del metodo di query. Tieni presente che questa annotazione può essere utilizzata solo su parametri di tipo {@link Date} con impostazione predefinitaTemporalType.DATE

[Informazioni sopra raccolte da varie fonti]


Perché non posso usarlo con il tipo di data / ora Java?
polvere 366

3
Quindi, se stai usando solo TemporalType.TIMESTAMP ... ha senso usare questa annotazione? Le date sembrano funzionare bene a tal fine senza di essa ..
Amalgovinus

come posso memorizzare in MySql DB nel formato comeyyyy-MM-dd
Shantaram Tupe

@shantaram_t questo potrebbe aiutarti
Ankur Singhal

1
Ho un input: 02/10/2017e voglio convertirlo in 2017-10-02o2017/10/02
Shantaram Tupe

42

@Temporal è un'annotazione JPA che può essere utilizzata per memorizzare nella tabella del database uno dei seguenti elementi di colonna:

  1. DATA ( java.sql.Date)
  2. TEMPO ( java.sql.Time)
  3. TIMESTAMP (java.sql.Timestamp )

Generalmente quando dichiariamo un Datecampo nella classe e proviamo a memorizzarlo.
Memorizzerà come TIMESTAMP nel database.

@Temporal
private Date joinedDate;

Il codice sopra memorizzerà l'aspetto del valore 08-07-17 04: 33: 35.870000000 PM

Se vogliamo memorizzare solo la DATA nel database,
possiamo usare / define TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Questa volta, memorizzerà l' 8-07-17 nel database

Esistono altri attributi @Temporalche possono essere utilizzati in base al requisito.


Il valore predefinito è TemporalType.DATE. Non hai idea del motivo per cui hai fornito un valore di attributo non annotato con parte di tempo.
Simon Logic

se due date sono uguali, l'aspetto sopra sarà funzionante (TemporalType.DATE).
Lova Chittumuri

Non fare Copia Incolla la risposta. stackoverflow.com/questions/25333711/...
Lova Chittumuri

10

I tipi temporali sono l'insieme di tipi basati sul tempo che possono essere usati nei mapping di stato persistenti.

L'elenco dei tipi temporali supportati comprende i tre java.sqltipi java.sql.Date, java.sql.Timee java.sql.Timestamp, e comprende i due java.utiltipi java.util.Datee java.util.Calendar.

I java.sqltipi sono completamente privi di problemi. Agiscono come qualsiasi altro tipo di mappatura semplice e non richiedono alcuna considerazione speciale.

Tuttavia, i due java.utiltipi richiedono metadati aggiuntivi per indicare quale dei java.sqltipi JDBC utilizzare durante la comunicazione con il driver JDBC. Questo viene fatto annotandoli con l' @Temporalannotazione e specificando il tipo JDBC come valore diTemporalType tipo enumerato.

Sono disponibili tre valori enumerati di DATE, TIME e TIMESTAMP per rappresentare ciascuno dei java.sqltipi.


4

Usa questo

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

public Calendar getCreateDate() {
    return createDate;
}

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

4

Se stai cercando una risposta breve:

Nel caso di utilizzo di java.util.Date, Java non sa come relazionarsi direttamente ai tipi SQL. È qui che @Temporalentra in gioco. Viene utilizzato per specificare il tipo SQL desiderato.

Fonte: Baeldung


3

Uso Hibernate 5.2 e @Temporalnon è più necessario.
java.util.date , sql.date , time.LocalDate vengono memorizzati nel DB con il tipo di dati appropriato come Date / timestamp.


allora qual è la soluzione se vogliamo solo salvare la data usando Hibernate 5.x
Kms

Uso di Java 8 LocalDate
Josh

1

Usiamo l'annotazione @Temporal per inserire data, ora o entrambi nella tabella del database. Usando TemporalType possiamo inserire dati, ora o entrambi int table.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.