Wozu dient die Annotation @Temporal im Ruhezustand?

100

Die Hibernate-Dokumentation enthält die folgenden Informationen für die @TemporalAnmerkung:

In einfachen Java-APIs ist die zeitliche Genauigkeit der Zeit nicht definiert. Wenn Sie mit zeitlichen Daten arbeiten, möchten Sie möglicherweise die erwartete Genauigkeit in der Datenbank beschreiben. Zeitliche Daten können die Genauigkeit DATE, TIME oder TIMESTAMP haben (dh das tatsächliche Datum, nur die Uhrzeit oder beides). Verwenden Sie die Annotation @Temporal, um dies zu optimieren.

Was heißt temporal precision of time is not defineddas Was sind temporalDaten und ihre Genauigkeit? Wie stimmt es ab?

Chaitanya
quelle
3
Wenn Sie Kalender als Entitätseigenschaft verwenden, werden in einfachem Java viele Informationen gedruckt, die nicht erforderlich sind, wenn Sie sie beispielsweise in einer Datenbank speichern möchten. In diesem Fall können Sie beispielsweise @Temporal (TemporalType.TIMESTAMP) verwenden. Kalender Kalender in Ihrer Entität, um Zeitstempel in Ihrer Datenbank oder nur Datum oder Uhrzeit zu speichern, indem Sie in Ihrer Kalendereigenschaft zu @Temporal (TemporalType.DATE) oder @Temporal (TemporalType.TIME) wechseln.
user3487063

Antworten:

103

Diese Anmerkung muss für persistente Felder oder Eigenschaften vom Typ java.util.Dateund angegeben werden java.util.Calendar. Sie darf nur für Felder oder Eigenschaften dieser Typen angegeben werden.

Die TemporalAnnotation kann in Verbindung mit der BasicAnnotation, der IdAnnotation oder der ElementCollectionAnnotation verwendet werden (wenn der Elementauflistungswert von einem solchen zeitlichen Typ ist.

In einfachen Java-APIs ist die zeitliche Genauigkeit der Zeit nicht definiert. Wenn Sie mit zeitlichen Daten arbeiten, möchten Sie möglicherweise die erwartete Genauigkeit in der Datenbank beschreiben. Zeitliche Daten können die Genauigkeit DATE, TIME oder TIMESTAMP haben (dh das tatsächliche Datum, nur die Uhrzeit oder beides). Verwenden Sie die @TemporalAnmerkung, um dies zu optimieren.

Die zeitlichen Daten sind die zeitbezogenen Daten. In einem Content-Management-System sind beispielsweise das Erstellungsdatum und das Datum der letzten Aktualisierung eines Artikels zeitliche Daten. In einigen Fällen benötigen zeitliche Daten Präzision und Sie möchten genaues Datum / Uhrzeit oder beides ( TIMESTAMP) in der Datenbanktabelle speichern.

Die zeitliche Genauigkeit ist in den Java-Kern-APIs nicht angegeben. @Temporalist eine JPAAnmerkung, die zwischen Zeitstempel und hin und her konvertiert java.util.Date. Es wandelt sich auch time-stampin Zeit um. Im folgenden Snippet wird beispielsweise @Temporal(TemporalType.DATE) der Zeitwert gelöscht und nur das Datum beibehalten .

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

Laut Javadocs

Anmerkung zum Deklarieren eines geeigneten {@code TemporalType} für Parameter der Abfragemethode. Beachten Sie, dass diese Anmerkung standardmäßig nur für Parameter vom Typ {@link Date} verwendet werden kannTemporalType.DATE

[Informationen oben aus verschiedenen Quellen gesammelt]

Ankur Singhal
quelle
Warum kann ich es nicht mit dem Java-Typ Timestamp verwenden?
Pulver366
3
Wenn Sie also nur TemporalType.TIMESTAMP verwenden ... hat die Verwendung dieser Anmerkung irgendeinen Sinn? Daten scheinen zu diesem Zweck ohne sie gut zu funktionieren.
Amalgovinus
wie ich in MySql DB im Format speichern kann alsyyyy-MM-dd
Shantaram Tupe
@shantaram_t das könnte dir helfen
Ankur Singhal
1
Ich habe Eingabe: 02/10/2017und möchte es konvertieren zu 2017-10-02oder2017/10/02
Shantaram Tupe
42

@Temporal ist eine JPA-Annotation, mit der in der Datenbanktabelle eines der folgenden Spaltenelemente gespeichert werden kann:

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

Im Allgemeinen, wenn wir ein DateFeld in der Klasse deklarieren und versuchen, es zu speichern.
Es wird als TIMESTAMP in der Datenbank gespeichert.

@Temporal
private Date joinedDate;

Der obige Code speichert den Wert wie folgt: 08-07-17 04: 33: 35.870000000 PM

Wenn wir nur das DATUM in der Datenbank speichern möchten , können
wir verwenden / definieren TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Dieses Mal würde es 08-07-17 in der Datenbank speichern

Es gibt einige andere Attribute @Temporal, die je nach Anforderung verwendet werden können.

Avikool91
quelle
Der Standardwert ist TemporalType.DATE. Haben Sie keine Ahnung, warum Sie einen nicht kommentierten Attributwert mit Zeitteil angegeben haben.
Simon Logic
Wenn zwei Daten gleich sind, funktioniert der oben beschriebene Aspekt (TemporalType.DATE).
Lova Chittumuri
Kopieren Fügen Sie die Antwort nicht ein. stackoverflow.com/questions/25333711/…
Lova Chittumuri
10

Zeitliche Typen sind zeitbasierte Typen, die in persistenten Zustandszuordnungen verwendet werden können.

Die Liste der unterstützten zeitlichen Typen umfasst die drei java.sqlTypen java.sql.Date, java.sql.Timeund java.sql.Timestamp, und es umfasst die beiden java.utilTypen java.util.Dateund java.util.Calendar.

Die java.sqlTypen sind völlig problemlos. Sie verhalten sich wie jeder andere einfache Zuordnungstyp und erfordern keine besondere Berücksichtigung.

Die beiden java.utilTypen benötigen jedoch zusätzliche Metadaten, um anzugeben, welcher der JDBC- java.sqlTypen bei der Kommunikation mit dem JDBC-Treiber verwendet werden soll. Dazu werden sie mit der @TemporalAnnotation versehen und der JDBC-Typ als Wert des TemporalTypeAufzählungstyps angegeben.

Es gibt drei aufgezählte Werte für DATE, TIME und TIMESTAMP, um jeden der java.sqlTypen darzustellen .

Montaser Mahadi
quelle
4

benutze das

@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
quelle
4

Wenn Sie nach einer kurzen Antwort suchen:

Bei der Verwendung von java.util.Date weiß Java nicht wirklich, wie man sich direkt auf SQL-Typen bezieht. Das ist wenn@Temporal ins Spiel kommt. Es wird verwendet, um den gewünschten SQL-Typ anzugeben.

Quelle: Baeldung

Skryvets
quelle
3

Ich benutze Hibernate 5.2 und @Temporalwird nicht mehr benötigt.
java.util.date , sql.date , time.LocalDate werden in der Datenbank mit dem entsprechenden Datentyp als Datum / Zeitstempel gespeichert.

Arun Raaj
quelle
Was ist dann die Lösung, wenn wir nur mit Hibernate 5.x
Kms
Verwendung von Java 8 LocalDate
Josh
1

Wir verwenden die Annotation @Temporal, um Datum, Uhrzeit oder beides in die Datenbanktabelle einzufügen. Mit TemporalType können wir Daten, Uhrzeit oder beides in die Tabelle int einfügen.

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