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