Тип 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" ) для столбца, определенного в классе сущностей