Hibernate: Есть ли способ программно создавать новые таблицы, которые напоминают существующую?

У меня есть веб-приложение, в котором есть много таблиц (каждая представляет POJO). Я написал файлы сопоставления для каждого класса, а затем использую Hibernate SchemaExport генерировать таблицы в моей базе данных. Теперь я хочу создать 2 дополнительные таблицы для каждой существующей таблицы, которая была создана:

  • Таблица разрешений пользователей - хранит разрешения пользователей для POJO, специфичные для каждого поля
    каждый столбец представляет поле в POJO, каждая строка представляет пользователя, каждая ячейка будет иметь значение "чтение", "запись" и т. д., представляющее разрешение пользователя на поле

  • Таблица истории данных - хранит всю историю данных с номером версии
    в этой таблице будут все столбцы таблицы POJO и 4 дополнительных поля: версия объекта данных, GUID транзакции (первичный ключ), метка данных и пользователь, выполнивший эту транзакцию.

Я хотел бы иметь возможность получить доступ к этим таблицам через Hibernate после их создания. Так что я могу легко добавлять / удалять / обновлять записи в них.


Мой вопрос

Большинство столбцов в дополнительных таблицах будут такими же, как таблица POJO. Поэтому я думаю, что, вероятно, лучше как-то ссылаться на таблицу POJO, а не создавать совершенно новые таблицы. Таким образом, если в таблицу POJO добавлено новое поле, эти таблицы будут иметь изменения автоматически. Но я не знаю, как это сделать. Я подумал, может быть, есть какой-то способ:

  • создавать файлы отображения hibernate, которые как-то ссылаются на таблицу POJO
    например, в моем новом файле POJOPermission.hbm.xml, чтобы как-то указать, используйте те же поля, что и в таблице POJO, и добавьте эти новые поля.
  • написать код Ja va для создания таблиц в Hibernate
    например, я могу использовать ja va.lang.Class, чтобы вернуть мне список всех полей в POJO, а затем перебрать их, каким-то образом установить их в качестве заголовков столбцов моей новой таблицы и каким-то образом вызвать Hibernate для создания этих таблиц во время выполнения

Может кто-нибудь сказать мне, как сделать что-либо из вышеперечисленного, или обойти эту проблему? У меня есть ощущение, что я могу думать об этом неправильно...

Спасибо!!!

[Правка - решение]

В итоге я использовал XSLT для перевода оригинальных файлов hbm.xml в новые, изменения типов полей и т. Д. И указал файл hibernate.cfg.xml, чтобы включить вновь созданные файлы. В конце просто запустите schemaexport для генерации всех файлов Ja va вместе...

3 ответа

Синтаксис CREATE TABLE зависит от конкретной реализации. В DB2 есть CREATE TABLE LIKE, но вам нужно проанализировать таблицы каталога, чтобы получить внешние и внутренние ключи, а затем сгенерировать ALTER TABLE..., чтобы реализовать то же самое. Другие базы данных могут иметь аналогичные.

Если вы хотите получить доступ к пользовательским разрешениям и истории данных через Hibernate, то я думаю, что вам нужно подойти к проблеме, подумав о том, как бы вы представляли их как POJO. Затем вы можете создать сопоставления для хранения их в базе данных.

С помощью "выбрать в" вы можете создать копию базовой структуры таблицы. Он копирует только столбцы и типы данных, а не ограничения или индексы. Если вам нужна только структура без данных, просто укажите предложение where, которое не возвращает записей.

select * into targettable from sourcetable where 1=0
Другие вопросы по тегам