Отсутствие @Temporal аннотации в спящем режиме
Что делать, если мы используем
@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
?
Ответы
Ответ 1
Только часть документации, которую мне удалось найти:
В простых API Java временная точность времени не определена. При работе с временными данными вы можете описать ожидаемую точность в базе данных. Временные данные могут иметь точность DATE, TIME или TIMESTAMP (т.е. фактическую дату, только время или оба). Используйте @Temporal аннотацию для точной настройки.
Из 2.2.2.1. Объявление основных сопоставлений свойств.
Это может указывать на то, что фактическое представление даты в базе данных не определено и, конечно, лучше указать его напрямую.
Ответ 2
Я понимаю, что этот вопрос уже был дан, но мы боролись с этим сегодня, поэтому я хотел дать более глубокое представление о будущих людях, которые спотыкаются об этом.
Используя Oracle 11g с драйверами версии 11, если вы не используете временную аннотацию, тогда каждый тип данных даты, времени и времени из Oracle будет сопоставляться с меткой времени в вашем коде во время выполнения. Функционально это прекрасно, однако это вызвало серьезные проблемы с производительностью. Это было связано с тем, что у нас был тип DATE как составной первичный ключ. Этот столбец был ведущим столбцом индекса, а также столбцом, который мы использовали для разбиения. Когда драйвер попытается сохранить записи с этим столбцом в предложении where, Oracle будет выполнять преобразование типов данных в БД с DATE на TIMESTAMP. Это сделало индекс бесполезным, и производительность была ужасной.
Дольше, добавьте эту аннотацию всегда, чтобы вы не были готовы заплатить цену.