Apa kegunaan anotasi @Temporal dalam mode Hibernate?

102

Dokumentasi Hibernasi memiliki informasi di bawah ini untuk @Temporalanotasi:

Dalam Java API biasa, ketepatan waktu tidak ditentukan. Saat berurusan dengan data temporal, Anda mungkin ingin menjelaskan ketepatan yang diharapkan dalam database. Data temporal dapat memiliki ketepatan TANGGAL, WAKTU, atau TIMESTAMP (yaitu tanggal aktual, hanya waktu, atau keduanya). Gunakan anotasi @Temporal untuk menyempurnakannya.

Apa temporal precision of time is not definedmaksudnya Apa itu temporaldata dan ketepatannya? Bagaimana cara menyempurnakannya?

Chaitanya
sumber
3
Jika Anda menggunakan Kalender sebagai properti Entitas Anda maka di java biasa ini mencetak banyak informasi yang tidak diperlukan ketika Anda ingin menyimpannya ke database, misalnya, Anda dapat memiliki sesuatu seperti @Temporal (TemporalType.TIMESTAMP) Kalender kalender di entitas Anda untuk menyimpan stempel waktu ke database Anda atau hanya tanggal atau hanya waktu dengan mengubah ke @Temporal (TemporalType.DATE) atau @Temporal (TemporalType.TIME) di properti Kalender Anda.
user3487063

Jawaban:

104

Anotasi ini harus ditentukan untuk bidang persisten atau properti tipe java.util.Datedan java.util.Calendar. Ini hanya dapat ditentukan untuk bidang atau properti jenis ini.

The Temporalpenjelasan dapat digunakan dalam hubungannya dengan Basicpenjelasan, para Idpenjelasan, atau ElementCollectionpenjelasan (ketika nilai koleksi elemen dari suatu jenis temporal.

Dalam Java API biasa, ketepatan waktu tidak ditentukan. Saat menangani data temporal, Anda mungkin ingin menjelaskan ketepatan yang diharapkan dalam database. Data temporal dapat memiliki ketepatan TANGGAL, WAKTU, atau TIMESTAMP (yaitu, tanggal sebenarnya, hanya waktu, atau keduanya). Gunakan @Temporalanotasi untuk menyempurnakannya.

Data temporal adalah data yang berhubungan dengan waktu. Misalnya, dalam sistem manajemen konten, tanggal pembuatan dan tanggal pembaruan terakhir artikel adalah data temporal. Dalam beberapa kasus, data temporal membutuhkan presisi dan Anda ingin menyimpan tanggal / waktu yang tepat atau keduanya ( TIMESTAMP) dalam tabel database.

Ketepatan temporal tidak ditentukan dalam API Java inti. @Temporaladalah JPAanotasi yang mengubah bolak-balik antara stempel waktu dan java.util.Date. Itu juga berubah time-stampmenjadi waktu. Misalnya, dalam cuplikan di bawah, @Temporal(TemporalType.DATE) hilangkan nilai waktu dan hanya pertahankan tanggalnya .

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

Sesuai javadocs,

Anotasi untuk menyatakan {@code TemporalType} yang sesuai pada parameter metode kueri. Perhatikan bahwa anotasi ini hanya dapat digunakan pada parameter jenis {@link Date} dengan defaultTemporalType.DATE

[Informasi di atas dikumpulkan dari berbagai sumber]

Ankur Singhal
sumber
Mengapa saya tidak dapat menggunakannya dengan Stempel Waktu tipe Java?
bubuk 366
3
Jadi, jika Anda hanya menggunakan TemporalType.TIMESTAMP ... apakah ada gunanya menggunakan anotasi ini? Tanggal tampaknya bekerja dengan baik untuk tujuan ini tanpa itu ..
Amalgovinus
bagaimana saya bisa menyimpan di MySql DB dalam format sebagaiyyyy-MM-dd
Shantaram Tupe
@shantaramt ini mungkin bisa membantu Anda
Ankur Singhal
1
Saya memiliki masukan: 02/10/2017dan ingin mengubahnya menjadi 2017-10-02atau2017/10/02
Shantaram Tupe
43

@Temporal adalah anotasi JPA yang dapat digunakan untuk menyimpan dalam tabel database pada item kolom berikut:

  1. TANGGAL ( java.sql.Date)
  2. WAKTU ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

Umumnya ketika kita mendeklarasikan Datefield di kelas dan mencoba menyimpannya.
Ini akan disimpan sebagai TIMESTAMP dalam database.

@Temporal
private Date joinedDate;

Kode di atas akan menyimpan nilai seperti 08-07-17 04: 33: 35.870000000 PM

Jika kita hanya ingin menyimpan DATE di database,
kita bisa menggunakan / define TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Kali ini, 08-07-17 akan menyimpan dalam database

Ada beberapa atribut lain yang juga @Temporaldapat digunakan berdasarkan kebutuhan.

Avikool91
sumber
Nilai defaultnya adalah TemporalType.DATE. Tidak tahu mengapa Anda memberikan nilai atribut non-anotasi dengan paruh waktu.
Simon Logic
Jika dua tanggal sama maka aspek kemauan di atas berfungsi (TemporalType.DATE).
Lova Chittumuri
Jangan lakukan Copy Paste jawabannya. stackoverflow.com/questions/25333711/…
Lova Chittumuri
10

Tipe temporal adalah kumpulan tipe berbasis waktu yang dapat digunakan dalam pemetaan status persisten.

Daftar jenis duniawi didukung meliputi tiga java.sqljenis java.sql.Date, java.sql.Timedan java.sql.Timestamp, dan itu termasuk dua java.utiljenis java.util.Datedan java.util.Calendar.

The java.sqljenis benar-benar bebas repot. Mereka bertindak seperti jenis pemetaan sederhana lainnya dan tidak memerlukan pertimbangan khusus.

Namun, kedua java.utiljenis tersebut memerlukan metadata tambahan untuk menunjukkan java.sqljenis JDBC mana yang akan digunakan saat berkomunikasi dengan driver JDBC. Ini dilakukan dengan memberi anotasi kepada mereka dengan @Temporalanotasi dan menentukan tipe JDBC sebagai nilai dari TemporalTypetipe enumerasi.

Ada tiga nilai enumerasi DATE, TIME, dan TIMESTAMP untuk mewakili masing-masing java.sqljenis.

Montaser Mahadi
sumber
4

Gunakan ini

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

Jika Anda mencari jawaban singkat:

Dalam kasus penggunaan java.util.Date, Java tidak benar-benar tahu bagaimana berhubungan langsung dengan tipe SQL. Ini adalah saat @Temporalmulai bermain. Ini digunakan untuk menentukan tipe SQL yang diinginkan.

Sumber: Baeldung

skryvets
sumber
3

Saya menggunakan Hibernate 5.2 dan @Temporaltidak diperlukan lagi.
java.util.date , sql.date , time.LocalDate disimpan ke dalam DB dengan tipe data yang sesuai sebagai Date / timestamp.

Arun Raaj
sumber
lalu apa solusinya jika kita hanya ingin menyimpan tanggal menggunakan Hibernate 5.x
Kms
Penggunaan Java 8 LocalDate
Josh
1

Kami menggunakan anotasi @Temporal untuk memasukkan tanggal, waktu atau keduanya dalam tabel database. Dengan menggunakan TemporalType kita dapat memasukkan data, waktu atau keduanya ke dalam tabel.

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