Изменить имя таблицы сущности во время выполнения?

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

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

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

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

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


person Joopiter    schedule 07.10.2010    source источник


Ответы (4)


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

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

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

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

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

person Pascal Thivent    schedule 07.10.2010
comment
Спасибо, мы создадим для этого синоним. - person Joopiter; 07.10.2010
comment
@Joopiter: Пожалуйста. Если это соответствует вашим потребностям, это, скорее всего, лучший выбор. - person Pascal Thivent; 07.10.2010

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

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

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

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

person Sean Patrick Floyd    schedule 07.10.2010
comment
Я не уверен, но не думаю, что стратегия именования должна возвращать вещи, которые постоянно меняются. Возможно, я слишком мал, но запросы CRUD, именованные запросы вычисляются и предварительно компилируются раз и навсегда во время создания EntityManagerFactory, я не понимаю, как может помочь стратегия динамического именования. - person Pascal Thivent; 07.10.2010
comment
Да, я так и думал. Имеет смысл. Но если это происходит раз в месяц, возможна автоматизация для воссоздания entitymanagerfactory или перезапуска контекста сервлета. - person Sean Patrick Floyd; 07.10.2010
comment
Конечно, я согласен с последней частью (но я хотел убедиться, что не упустил ничего очевидного в стратегии именования). - person Pascal Thivent; 07.10.2010

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

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

person Henning    schedule 07.10.2010
comment
Первоначально это был дизайн (со столбцами года и месяца), но мы обнаружили, что благодаря этому доступ к данным становится более эффективным. При необходимости нам, возможно, придется вернуться к предыдущей реализации. - person Joopiter; 07.10.2010
comment
@Joopiter: доступ не должен быть менее эффективным, если вы убедитесь, что у вас есть эффективные индексы (в столбце года и месяца, а также в любых других столбцах, которые вы используете в предложениях where, в порядке их соответствия запросу). Этот дизайн может возможно стать неэффективным, если таблица имеет такой размер, что индекс не помещается в памяти сервера базы данных. - person Henning; 07.10.2010
comment
Такое горизонтальное разбиение полностью стандартно для данных таймсерий. Некоторые базы данных теперь поддерживают его изначально; он позволяет тривиально исключать целые таблицы из запросов, если в них указаны диапазоны дат. - person Nick Johnson; 21.01.2013

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

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

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

person Denilson    schedule 26.07.2017
comment
Это должно быть в разделе комментариев. - person UmarZaii; 26.07.2017