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

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

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

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

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


Мой вопрос

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

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

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

Спасибо !!!

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

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

Ответы [ 3 ]

1 голос
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

select * into targettable from sourcetable where 1=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...