Установка метки времени столбца по умолчанию, не зависящей от базы данных, с помощью Hibernate

Я работаю над java-проектом, полным файлов сопоставления Hibernate (3.3.1), которые имеют следующие объявления для большинства объектов домена.

<property name="dateCreated" generated="insert">
     <column name="date_created" default="getdate()" />
</property>

Проблема здесь в том, что getdate () является специальной функцией MSSQL, и когда я использую что-то вроде H2 для тестирования подразделов проекта, H2 кричит, что

getdate() 

не является признанной функцией. Его собственная функция отметки времени

current_timestamp(). 

Я хотел бы иметь возможность продолжать работать с H2 для тестирования и хотел узнать, есть ли способ сообщить Hibernate «использовать собственный механизм этой базы данных для получения текущей метки времени». С H2 я пришел к следующему решению.

CREATE ALIAS getdate AS $$ java.util.Date now() { return new java.util.Date(); } $$;
CALL getdate();

Он работает, но явно специфичен для H2.

Я пробовал расширить H2Dialect и зарегистрировать функцию getdate (), но она, похоже, не вызывается, когда Hibernate создает таблицы. Можно ли абстрагироваться от идеи временной метки по умолчанию от конкретного движка базы данных?


person Fil    schedule 08.06.2010    source источник


Ответы (2)


Не могли бы вы попробовать следующее (без generated, поскольку ваша база данных не генерирует значение):

<column  name="DATE_CREATED" sql-type="timestamp"  default="CURRENT_TIMESTAMP"/>
person Pascal Thivent    schedule 08.06.2010
comment
Я мог бы. Я хочу сказать не о том, что я хотел бы полностью переключиться на H2, а о том, что я тестирую небольшие участки кода, где мне действительно не нужно использовать MSSQL, и где использование БД в памяти, например H2, делает мои тестирование намного быстрее и приятнее. Было бы глупо иметь другое имя для функции отметки времени в каждой СУБД. - person Fil; 09.06.2010
comment
HSQLDB очень похож на H2 (никогда не использовал H2, поэтому я точно не знаю разбивку функций) и поддерживает CURRENT_TIMESTAMP. Я все время использую HSQL для модульного тестирования в памяти. hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html# N10544 - person matt b; 09.06.2010
comment
@unsquared: Я не уверен на 100%, но думаю, что приведенное выше предложение переносимо. - person Pascal Thivent; 09.06.2010
comment
@matt: Да, но я говорю H2 против MSSQL, а не H2 против HQL - person Fil; 09.06.2010
comment
@unsquared, верно, но CURRENT_TIMESTAMP действителен как в MSSQL, так и в HSQL. - person matt b; 09.06.2010
comment
@pascal: Спасибо тебе тоже. Не знаю, как я сам пропустил это решение. - person Fil; 10.06.2010
comment
Для получения дополнительной информации о getdate и current_timestamp см. stackoverflow.com/questions/186572/ - person Angus; 27.10.2015

Вы пробовали использовать a <timestamp> отображение внутри вашего <class>?

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

Вы можете указать, должен ли Hibernate использовать значение, созданное базой данных, задав generated="insert" или generated="always".

person matt b    schedule 08.06.2010
comment
Сгенерированное свойство на самом деле не выполняет никакой генерации (я пробовал). Из документа, на который вы ссылались: Когда Hibernate выдает SQL INSERT или UPDATE для объекта, который определил сгенерированные свойства, он сразу же после этого выдает select для получения сгенерированных значений. Это предполагает, что база данных уже настроена для генерации. Мы уже используем сопоставление временных меток, но оно обновляется всякий раз, когда к объекту обращается Hibernate, а не просто, когда он был создан. - person Fil; 08.06.2010
comment
Ах, я подумал, что сгенерированный документ означает сгенерированный специфической функцией базы данных, о которой будет знать диалект. - person matt b; 08.06.2010
comment
Ага. Я предположил то же самое и был в процессе отказа от всех этих функций getdate (), когда я действительно попробовал это и увидел, что все мои столбцы установлены в NULL. Это было бы удобным местом для отказа от ответственности в документации по Hibernate. - person Fil; 08.06.2010