JPA 2.0 Oracle DATE имеет нулевое время - PullRequest
5 голосов
/ 12 августа 2010

Это похоже на глупый вопрос, но я весь день гонюсь за хвостом по дереву. У меня есть приложение Struts 2 + Spring3 / JPA / Hibernate, которое вставляет большой набор в БД. В наборе есть дата использования Java. Я проверил дату как раз перед тем, как Дао вставит строки, и у всех дат будет правильное время. После вставки все строки в БД Oracle не имеют времени, только дата. Это как если бы время было сокращено, но в транзакции не было ошибок.

Я думал, прежде чем отправлять какой-либо код, я хотел бы задать вопрос, чтобы узнать, может ли кто-то предложить что-то, что я, возможно, пропустил? БД Oracle 10g. JPA 2.0. Колонка имеет аннотацию:

@Column(name = "READING_DATE")
@Temporal(TemporalType.DATE)
private Date readingDate;

Установка типа столбца TemporalType.TIMESTAMP приводит к исключению Hibernate

column READING_DATE. Found: date, expected: timestamp

Любые / все ответы приветствуются.

Ответы [ 2 ]

11 голосов
/ 12 августа 2010

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

В любом случае, я понимаю, что вам действительно нужно следующее отображение (для DATE и TIME):

@Column(name = "READING_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date readingDate;

И проблема, с которой вы сталкиваетесь, как-то связана с безумием, введенным Oracle с версией 9.2, см. Что происходит с DATE и TIMESTAMP? (короче говоря, они ввели столбец TIMESTAMP и изменили отображение типа SQL DATE, прочитайте FAQ).Есть несколько вариантов ее решения (я, конечно, предполагаю, что вы используете отображение TemporalType.TIMESTAMP):

Либо используйте TIMESTAMP тип столбца (я не имею в виду TemporalType.TIMESTAMP здесь я действительно имею в виду тип столбца на стороне БД).Но если вам не нужна наносекундная точность, это не лучший выбор.

Или установите режим совместимости oracle.jdbc.V8Compatible=true, либо как системное свойство, либо как свойство соединения:

<property name="hibernate.connection.oracle.jdbc.V8Compatible">true</property>

Да, вы можете установить произвольные свойства подключения, как это.Из документации Hibernate:

3.3.Соединения JDBC

...

Произвольные свойства соединения могут быть переданы путем добавления «hibernate.connection» к имени свойства соединения.Например, вы можете указать charSet свойство соединения, используя hibernate.connection.charSet.

Или используйте драйвер Oracle JDBC 11.1 (они «исправили» проблему, отменив изменение).Это ИМО идеальное решение (устаревшее V8Compatible).

Связанные с этим проблемы

0 голосов
/ 08 ноября 2012

Используйте ojdbc6.jar и используйте приведенный ниже код для Hibernate 3.3 установить метку времени вместо java.sql.date или java.util.date

@Id
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "TDATE", length = 7)
public Date getTdate() {
    return this.tdate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...