Изменить имя таблицы сущности во время выполнения? - PullRequest
19 голосов
/ 07 октября 2010

Эта таблица создается ежемесячно.В основном структура таблиц всех ежемесячных таблиц одинакова.

Поскольку было бы много работы для сопоставления одного и того же объекта только с другим именем таблицы,

Можно ли изменить имя таблицы сущности следующим образом во время выполнения, поскольку они все-таки имеют одинаковую структуру таблицы?

   @Entity
   @Table(name="FOO_JAN2010") // any other ways to generate this dynamically?
   public class FooJan2010Table {  // if we can dynamically set the table name this can be simply named FooTable
       ...
   }

Если нет, какой подход вы можете предложить?

Ответы [ 4 ]

7 голосов
/ 07 октября 2010

Можно ли изменить имя таблицы сущности следующим образом во время выполнения, так как они все-таки имеют одинаковую структуру таблицы?

Это на самом деле невозможно, по крайней мере, сстандартный JPA (что не означает, что я сделал это с нестандартным JPA), как указано в таких вопросах, как:

Подводя итог, JPA не предлагает способ "изменить" заданную сущность уже инициализированной единицы персистентности (и связанные предварительно скомпилированные запросы CRUD, предварительно скомпилированныеименованные запросы и т. д.).

Тем не менее, поскольку вы используете Hibernate, возможно, взгляните на http://www.hibernate.org/171.html, чтобы получить представление о том, что будет возможно с использованием Hibernate Core API.

Другой вариант, который я могу придумать, - это использовать базу данныхse синоним / псевдоним : FOO будет псевдонимом для FOO_JAN2010, пока ... вы не измените псевдоним так, чтобы он указывал на FOO_FEB2010.Я никогда не проверял это, я не знаю, будет ли это соответствовать вашим потребностям.Но это другая идея.

5 голосов
/ 07 октября 2010

Вы можете , вероятно, сделать это, используя Стратегии именования , если вы используете Hibernate в качестве поставщика JPA.См. мой ответ на этот предыдущий вопрос для справки.

Вы должны иметь возможность разработать свою стратегию именования для динамического возврата имен таблиц.

Вопрос о том, следует сделать это совершенно другим способом, однако.

Также, спасибо Паскалю за напоминание, это будет работать, только если EntityManagerFactory воссоздается один раз в месяц (есть много способовчтобы сделать это, перезапустите веб-приложение, являющееся самым простым)

1 голос
/ 07 октября 2010

Я не могу представить себе хороший способ отобразить это. Если это устаревшая база данных, вам будет сложно использовать JPA для доступа к ней.

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

0 голосов
/ 26 июля 2017

Я тоже не мог понять это, имел аналогичное требование.

Поскольку мое имя таблицы менялось относительно редко (ежедневно), я в итоге определил псевдоним БД для «активной» таблицы в СУБД (я использую DB2) и сослался на имя псевдонима таблицы в аннотации @Table. *

Я полностью осознаю, что это не совсем то, что спросил ОП, но подумал, что поделюсь опытом.

...