Какая польза от аннотации @Temporal в Hibernate?

102

В документации по Hibernate есть информация для @Temporalаннотации ниже:

В простых API Java временная точность времени не определена. При работе с временными данными вы можете описать ожидаемую точность в базе данных. Временные данные могут иметь точность DATE, TIME или TIMESTAMP (т.е. фактическая дата, только время или и то, и другое). Используйте аннотацию @Temporal, чтобы настроить это.

Что temporal precision of time is not definedзначит? Что такое temporalданные и их точность? Как он настраивается?

Чайтанья
источник
3
Если вы используете Calendar в качестве свойства Entity, то в обычном java он печатает много информации, которая не нужна, например, когда вы хотите сохранить ее в базе данных. В этом случае вы можете иметь что-то вроде @Temporal (TemporalType.TIMESTAMP) Calendar Calendar в вашей сущности для хранения отметки времени в вашей базе данных или просто даты или времени, изменив на @Temporal (TemporalType.DATE) или @Temporal (TemporalType.TIME) в свойстве Calendar.
user3487063

Ответы:

104

Эта аннотация должна быть указана для постоянных полей или свойств типа java.util.Dateи java.util.Calendar. Его можно указывать только для полей или свойств этих типов.

TemporalАннотации могут быть использованы в сочетании с Basicаннотациями, в Idаннотации, или ElementCollectionаннотациях (когда значение элемента коллекции имеет такой временный типа.

В простых API Java временная точность времени не определена. Имея дело с временными данными, вы можете описать ожидаемую точность в базе данных. Временные данные могут иметь точность DATE, TIME или TIMESTAMP (т.е. фактическая дата, только время или и то, и другое). Используйте @Temporalаннотацию, чтобы настроить это.

Временные данные - это данные, относящиеся ко времени. Например, в системе управления контентом дата создания и дата последнего обновления статьи являются временными данными. В некоторых случаях временные данные требуют точности, и вы хотите сохранить точную дату / время или и то, и другое ( TIMESTAMP) в таблице базы данных.

Временная точность не указана в основных API Java. @Temporal- это JPAаннотация, которая преобразует метку времени и java.util.Date. Он также преобразуется time-stampво время. Например, в приведенном ниже фрагменте @Temporal(TemporalType.DATE) удаляется значение времени и сохраняется только дата .

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

Согласно javadocs,

Аннотация для объявления соответствующего {@code TemporalType} в параметрах метода запроса. Обратите внимание, что эту аннотацию можно использовать только с параметрами типа {@link Date} по умолчаниюTemporalType.DATE

[Информация выше собрана из различных источников]

Анкур Сингхал
источник
Почему я не могу использовать его с меткой времени типа Java?
Powder366
3
Итак, если вы просто используете TemporalType.TIMESTAMP ... есть ли смысл использовать эту аннотацию? Даты, кажется,
подходят
как я могу хранить в MySql DB в формате какyyyy-MM-dd
Shantaram
@shantaram_t это может помочь вам
Анкур Singhal
1
У меня есть ввод: 02/10/2017и я хочу преобразовать его в 2017-10-02или2017/10/02
Шантарам Тупе
43

@Temporal - это аннотация JPA, которую можно использовать для хранения в таблице базы данных следующих элементов столбца:

  1. ДАТА ( java.sql.Date)
  2. ВРЕМЯ ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

Обычно, когда мы объявляем Dateполе в классе и пытаемся его сохранить.
Он будет храниться в базе данных как TIMESTAMP .

@Temporal
private Date joinedDate;

Приведенный выше код будет хранить значение, как 08-07-17 04: 33: 35.870000000 PM

Если мы хотим сохранить в базе данных только ДАТУ ,
мы можем использовать / define TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

На этот раз он будет хранить в базе данных 08-07-17.

Есть и другие атрибуты, @Temporalкоторые можно использовать в зависимости от требований.

Avikool91
источник
Значение по умолчанию - TemporalType.DATE. Понятия не имею, почему вы указали значение атрибута без аннотации с временной частью.
Simon Logic
если две даты совпадают по желанию, выше аспект работает (TemporalType.DATE).
Лова Читтумури
Не делайте Копировать Вставьте ответ. stackoverflow.com/questions/25333711/…
Лова Читтумури
10

Временные типы - это набор основанных на времени типов, которые могут использоваться в постоянных сопоставлениях состояний.

Список поддерживаемых типов временных включает в себя три java.sqlтипа java.sql.Date, java.sql.Timeи java.sql.Timestamp, и она включает в себя два java.utilтипа java.util.Dateи java.util.Calendar.

Эти java.sqlтипы полностью без проблем. Они действуют так же, как и любой другой простой тип сопоставления, и не требуют особого рассмотрения.

Однако для этих двух java.utilтипов требуются дополнительные метаданные, чтобы указать, какой из java.sqlтипов JDBC использовать при взаимодействии с драйвером JDBC. Это делается путем аннотирования их @Temporalаннотацией и указания типа JDBC как значения TemporalTypeперечислимого типа.

Есть три пронумерованных значения DATE, TIME и TIMESTAMP для представления каждого из java.sqlтипов.

Монтасер Махади
источник
4

использовать это

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

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}
Ганеш Гири
источник
4

Если вы ищете краткий ответ:

В случае использования java.util.Date Java действительно не знает, как напрямую относиться к типам SQL. Вот когда @Temporalвступает в игру. Он используется для указания желаемого типа SQL.

Источник: Baeldung

скрывец
источник
3

Я использую Hibernate 5.2, и @Temporalон больше не требуется.
java.util.date , sql.date , time.LocalDate сохраняются в БД с соответствующим типом данных как Дата / отметка времени.

Арун Раадж
источник
тогда каково решение, если мы хотим сохранить дату только с помощью Hibernate 5.x
Kms
Использование Java 8 LocalDate
Джош,
1

Мы используем аннотацию @Temporal для вставки даты, времени или того и другого в таблицу базы данных. Используя TemporalType, мы можем вставлять данные, время или обе таблицы int.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Самим Хоссейн
источник