Тип Java для даты/времени при использовании Oracle Date with Hibernate
У нас есть столбец Oracle Date. Сначала в нашем классе Java/Hibernate мы использовали java.sql.Date
. Это сработало, но, похоже, оно сохраняло информацию о времени в базе данных при сохранении, поэтому я изменил тип данных Java на Timestamp. Теперь мы получаем эту ошибку:
springframework.beans.factory.BeanCreationException: Ошибка при создании bean с именем "org.springframework.dao.an notation.PersistenceExceptionTranslationPostProcessor # 0' определенный в ресурсе пути к классам [Маржа-сервис-домен -config.xml]: Инициализация bean не удалась; вложенное исключение org.springframework.beans.factory.BeanCreatio nException: Ошибка при создании bean с имя" sessionFactory", определенное в классе ресурс пути [m-service-doma in-config.xml]: вызов init метод не выполнен; вложенное исключение org.hibernate.HibernateException: Неверный тип столбца: CREATE_TS, Ожидается: отметка времени
Любые идеи о том, как сопоставить Oracle Date
, сохраняя при этом временную часть?
Обновление: я могу заставить его работать, если я использую тип данных Oracle Timestamp
, но я не хочу этого уровня точности в идеале. Просто хочу базовый Oracle Date
.
Ответы
Ответ 1
Не прямой ответ, но я бы использовал тип Oracle TIMESTAMP:
-
TIMESTAMP (fractional_seconds_ precision) Значения года, месяца и дня даты, а также часа, минуты и вторых значений времени, где fractional_seconds_precision
необязательно указывает количество цифры в дробной части SECOND
datetime и может быть число в диапазоне от 0 до 9. по умолчанию - 6. Например, вы указываете TIMESTAMP
как литерал следующим образом:
TIMESTAMP'1997-01-31 09:26:50.124'
с желаемым fractional_second_precision
.
Ответ 2
Я всегда использую java.util.Date с датами Oracle, и он отлично справляется с датой и временем.
Ответ 3
Возможно, у вас есть эта проблема? Удостоверьтесь, что у вас есть последний драйвер JDBC, имя файла должно быть ojdbc5.jar.
Ответ 4
Сначала вы правы, что вам нужно будет использовать класс java.sql.Timestamp, поскольку класс java.sql.Date явно не представляет определенное время суток (скорее, он пытается представить полночь GMT).
Что касается вашей ошибки - вы не указали достаточно информации, чтобы сделать что-либо большее, чем угадать (для фактического определения причины вам потребуется посмотреть как вашу конфигурацию Hibernate, так и класс). Однако, если вы просто изменили класс поля в классе Java, то, конечно, вам также придется обновлять сопоставление Hibernate. Если вы не сделали последнего, это, скорее всего, приведет к вашему несоответствию. Попробуйте явно указать type="timestamp"
для соответствующего сопоставления.
EDIT: если вы используете аннотации, обновили ли вы аннотацию этого свойства до @Temporal(TemporalType.TIMESTAMP)
? Если вы этого не сделали, вам понадобится (и если вы это сделали, вы должны были сказать так: -)).
Ответ 5
Вы восстановили базу данных после того, как сделали это изменение?
Если Hibernate изначально создала таблицу, используя java.sql.Date для столбца, я не знаю, каким образом это могло бы изменить ее на основе изменения только кода Java.
Ответ 6
Вам нужно использовать
@Type (type = "org.joda.time.contrib.hibernate.PersistentDateTime" )
для столбца, определенного в классе сущностей