Динамическое создание таблиц в среде Hibernate - PullRequest
2 голосов
/ 13 января 2011

Есть корпоративное приложение, использующее Java + Hibernate + PostgreSQL. Hibernate настраивается с помощью аннотаций в исходном коде Java. Пока схема базы данных исправлена, но я столкнулся с проблемой, что она должна быть динамической: я могу получать данные из разных мест, и мне нужно хранить их в разных таблицах. Это означает, что мне нужно создавать таблицы во время выполнения. К счастью, кажется, что все эти данные, поступающие из разных институтов, могут иметь одну и ту же схему. Но я до сих пор не знаю, как это сделать с помощью Hibernate. Есть две основные проблемы:

  1. Как сообщить Hibernate, что многие разные таблицы имеют одинаковую структуру? Например, класс «Пациент» может быть сопоставлен не только с таблицей «пациент», но и с таблицей «Patient_mayo_clinic», «Patient_NorthWestern» и т. Д. Я чувствую, что это вызывает неоднозначность: как Hibernate знает, к какой таблице обращаться, делать операции на классе пациента? Это может быть любая (но только одна) из ранее перечисленных таблиц.
  2. Как я могу динамически создавать таблицы в Hibernate и привязывать к ним класс?

Ответ на предложения: Спасибо за все предложения. Пока что все ответы препятствовали динамическому созданию таблиц. Я отмечу ответ Акселя, так как он достигает определенных целей и является поддерживаемым решением. В частности, это называется мульти-аренда. Иногда важно знать некоторые важные фразы, которые описывают нашу проблему (или часть нашей проблемы). Вот несколько ссылок о мультитенантности:

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

Ответы [ 4 ]

4 голосов
/ 13 января 2011

Вы не можете сделать это с помощью Hibernate.

Почему бы не расширить таблицу пациентов с помощью столбца института?

Таким образом, вы сможете дифференцироваться, не сталкиваясь с проблемами отображения..

3 голосов
/ 13 января 2011

Боюсь, что вы не можете сделать это легко в Hibernate. Вам нужно будет сгенерировать исходный код Java, скомпилировать его, добавить в путь к классам и динамически загрузить его с помощью пакета java.reflection. Если это сработает, в чем я сомневаюсь, это будет ужасное решение (ИМХО).

Рассматривали ли вы использование базы данных без схемы, т.е.: Базы данных NoSQL или RDF базы данных. Они гораздо более гибки с точки зрения того, что вы можете хранить в них, в основном вещи не привязаны к реляционной схеме.

2 голосов
/ 13 января 2011

В большинстве сред не стоит создавать динамические таблицы просто потому, что dbas не даст вам прав на создание таблиц в рабочей среде.

Ответ Акселя может быть правильным для вас. Также посмотрите на Inheritance Mapping для Hibernate.

1 голос
/ 13 января 2011

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

Лично я бы поступил так, как предложил Аксель Фонтейн, но если вам нужны динамические таблицы, я бы подумал об использовании Partitioning .

PostgreSQL позволяет вам создавать основную таблицу и несколько дочерних таблиц (разделов), записи между дочерними таблицами являются дизъюнктивными, но каждая запись из любой дочерней таблицы видна в родительской таблице. Это означает, что вы можете вставлять строки в любую дочернюю таблицу, которую хотите, используя простой оператор вставки (это не круто , но имеет тот же уровень сложности, что и составление и сохранение сущности, так что это приемлемо в вашем случае) и запрос базы данных с использованием HQL

...