Изменить имя таблицы объекта во время выполнения?

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

Так как было бы очень сложно отобразить один и тот же объект только с другим именем таблицы,

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

   @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
       ...
   }

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Кроме того, спасибо Pascal за то, что он мне напомнил, это будет работать только в том случае, если EntityManagerFactory воссоздается один раз в месяц (есть много способов сделать это, перезапустив webapp, являющийся самым простым)

Ответ 3

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

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

Ответ 4

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

Так как имя моей таблицы изменялось относительно редко (ежедневно), я в конечном итоге определял псевдоним DB в "активной" таблице в RDBMS (я использую DB2) и ссылался на имя псевдонима таблицы в аннотации @Table.

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