Jaki jest pożytek z adnotacji @Temporal w Hibernate?


102

Dokumentacja Hibernate zawiera poniższe informacje dotyczące @Temporaladnotacji:

W prostych interfejsach API języka Java czasowa precyzja czasu nie jest zdefiniowana. Mając do czynienia z danymi czasowymi, możesz chcieć opisać oczekiwaną dokładność w bazie danych. Dane czasowe mogą mieć dokładność DATE, TIME lub TIMESTAMP (tj. Rzeczywista data, tylko godzina lub jedno i drugie). Użyj adnotacji @Temporal, aby to dostroić.

Co to temporal precision of time is not definedznaczy? Czym są temporaldane i ich dokładność? Jak to dostroić?


3
Jeśli używasz kalendarza jako swojej właściwości Entity, to w zwykłym java drukuje wiele informacji, które nie są konieczne, na przykład, gdy chcesz zapisać je w bazie danych.W takim przypadku możesz mieć coś takiego jak @Temporal (TemporalType.TIMESTAMP) Kalendarz kalendarza w Twojej encji do przechowywania sygnatury czasowej w bazie danych lub tylko daty lub tylko godziny, zmieniając na @Temporal (TemporalType.DATE) lub @Temporal (TemporalType.TIME) we właściwości Calendar.
user3487063

Odpowiedzi:


104

Ta adnotacja musi być określona dla trwałych pól lub właściwości typu java.util.Datei java.util.Calendar. Można go określić tylko dla pól lub właściwości tego typu.

TemporalAdnotacji mogą być stosowane w połączeniu z Basicprzypisaniem, do Idopisywania, lub ElementCollectionadnotacją (gdy wartość element pobierający jest takiego typu, w czasie.

W zwykłych interfejsach API języka Java czasowa precyzja czasu nie jest zdefiniowana. W przypadku danych czasowych możesz chcieć opisać oczekiwaną dokładność w bazie danych. Dane czasowe mogą mieć dokładność DATE, TIME lub TIMESTAMP (tj. Rzeczywista data, tylko godzina lub jedno i drugie). Użyj @Temporaladnotacji, aby to dostosować.

Dane czasowe to dane dotyczące czasu. Na przykład w systemie zarządzania treścią data utworzenia i data ostatniej aktualizacji artykułu są danymi czasowymi. W niektórych przypadkach dane czasowe wymagają precyzji i chcesz przechowywać dokładną datę / godzinę lub obie te wartości ( TIMESTAMP) w tabeli bazy danych.

Precyzja czasowa nie jest określona w podstawowych interfejsach API języka Java. @Temporalto JPAadnotacja, która jest konwertowana między znacznikami czasu i java.util.Date. To także przekształca się time-stampw czas. Na przykład w poniższym fragmencie @Temporal(TemporalType.DATE) zmniejsza wartość czasu i zachowuje tylko datę .

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

Zgodnie z javadocs,

Adnotacja umożliwiająca zadeklarowanie odpowiedniego {@code TemporalType} w parametrach metody zapytania. Pamiętaj, że ta adnotacja może być używana tylko z parametrami typu {@link Date} z wartością domyślnąTemporalType.DATE

[Powyższe informacje zebrane z różnych źródeł]


Dlaczego nie mogę go używać z datownikiem typu Java?
proszek 366

3
Więc jeśli używasz tylko TemporalType.TIMESTAMP ... czy jest jakiś sens, aby używać tej adnotacji? Daty wydają się działać dobrze bez tego ...
Amalgovinus

jak mogę przechowywać w MySql DB w formacie asyyyy-MM-dd
Shantaram Tupe

@shantaram_t to może ci pomóc
Ankur Singhal,

1
Mam dane wejściowe: 02/10/2017i chcę przekonwertować to na 2017-10-02or2017/10/02
Shantaram Tupe

43

@Temporal to adnotacja JPA, której można użyć do przechowywania w tabeli bazy danych następujących elementów kolumny:

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

Generalnie, gdy deklarujemy Datepole w klasie i próbujemy je przechowywać.
Będzie przechowywany jako TIMESTAMP w bazie danych.

@Temporal
private Date joinedDate;

Powyższy kod przechowuje wartość wyglądającą jak 08-07-17 04: 33: 35.870000000 PM

Jeśli chcemy przechowywać w bazie tylko DATĘ ,
możemy użyć / zdefiniować TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Tym razem zapisze 08-07-17 w bazie danych

Istnieją również inne atrybuty, @Temporalktórych można użyć w zależności od wymagań.


Wartość domyślna to TemporalType.DATE. Nie mam pojęcia, dlaczego podałeś wartość atrybutu bez adnotacji z częścią czasową.
Simon Logic

jeśli dwie daty są takie same przez wolę, powyższy aspekt działa (TemporalType.DATE).
Lova Chittumuri


10

Typy czasowe to zestaw typów opartych na czasie, których można używać w trwałych mapowaniach stanu.

Listę obsługiwanych rodzajów czasowych obejmuje trzy java.sqltypy java.sql.Date, java.sql.Timei java.sql.Timestamp, i obejmuje dwa java.utiltypy java.util.Datea java.util.Calendar.

Te java.sqltypy są całkowicie bezproblemowe. Działają jak każdy inny prosty typ mapowania i nie wymagają specjalnego rozważania.

Te dwa java.utiltypy wymagają jednak dodatkowych metadanych, aby wskazać, który z java.sqltypów JDBC ma być używany podczas komunikacji ze sterownikiem JDBC. Odbywa się to poprzez dodanie do nich @Temporaladnotacji i określenie typu JDBC jako wartości TemporalTypetypu wyliczeniowego.

Istnieją trzy wyliczone wartości DATE, TIME i TIMESTAMP, które reprezentują każdy z java.sqltypów.


4

Użyj tego

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

public Calendar getCreateDate() {
    return createDate;
}

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

4

Jeśli szukasz krótkiej odpowiedzi:

W przypadku korzystania z java.util.Date, Java tak naprawdę nie wie, jak bezpośrednio odnosić się do typów SQL. To wtedy @Temporalwchodzi do gry. Służy do określenia żądanego typu SQL.

Źródło: Baeldung


3

Używam Hibernate 5.2 i @Temporalnie jest już wymagane.
java.util.date , sql.date , time.LocalDate są przechowywane w bazie danych z odpowiednim typem danych, jak data / znacznik czasu.


to jakie jest rozwiązanie, jeśli chcemy tylko zapisać datę za pomocą Hibernate 5.x
Kms

Korzystanie z Java 8 LocalDate
Josh

1

Używamy adnotacji @Temporal do wstawiania daty, godziny lub obu w tabeli bazy danych. Używając TemporalType możemy wstawić dane, czas lub obie int tabeli.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.