Отсутствие аннотации @Temporal в спящем режиме - PullRequest
26 голосов
/ 12 декабря 2011

Что если мы используем

@Column(name="birth_date", nullable=false, length=19)
public Date getBirthDate() {
    return this.birthDate;
}

вместо

@Temporal(TemporalType.TIMESTAMP)
@Column(name="birth_date", nullable=false, length=19)
public Date getBirthDate() {
    return this.birthDate;
}

Есть ли побочные эффекты, если мы используем свойство столбца даты без @Temporal аннотации?

Ответы [ 2 ]

29 голосов
/ 12 декабря 2011

Только часть документации, которую мне удалось найти:

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

From 2.2.2.1.Объявление основных сопоставлений свойств .

Это может означать, что фактическое представление даты в базе данных не определено, и, конечно, лучше указать его напрямую.

22 голосов
/ 14 июля 2012

Я понимаю, что на этот вопрос уже был дан ответ, но мы боролись с этим сегодня, поэтому я хотел дать немного больше понимания будущим людям, которые сталкиваются с этим.

Использование Oracle 11g с драйверами версии 11, если вы не используете временную аннотацию, тогда каждый тип данных даты, времени и метки времени из Oracle будет сопоставляться с меткой времени в вашем коде во время выполнения.С функциональной точки зрения это нормально, однако это вызвало у нас серьезные проблемы с производительностью.Это было потому, что у нас был тип DATE как часть составного первичного ключа.Этот столбец был ведущим столбцом индекса, а также столбцом, который мы использовали для разделения.Когда драйвер попытается сохранить записи с этим столбцом в предложении where, Oracle выполнит преобразование типа данных в БД из DATE в TIMESTAMP.Это делало индекс бесполезным, а производительность была ужасной.

Длинная история, добавьте эту аннотацию всегда, чтобы не быть готовым заплатить цену.

...