Как указать разное количество единиц персистентности в JPA persistence.xml на уровне развертывания - PullRequest
2 голосов
/ 10 марта 2011

У меня есть программа J2SE, которую я перехожу, чтобы использовать JPA. Существующая программа общается от 1 до 4 баз данных. База данных, к которой она обращается, зависит от привязки таблицы -> базы данных к развертыванию. Когда используется более 1 базы данных, это происходит потому, что некоторые таблицы были перенесены в другую базу данных (горизонтальное разбиение на уровне базы данных, а не на уровне таблицы). Это настраивается для каждого развертывания - пользователь сам решает, как он хочет структурировать настройки своей базы данных.

Существующий код выглядит как

Connection con = getConnectionBasedOnTable(domainObject.getClass());
// execute statement, etc...

С (J2SE) JPA я хочу использовать что-то вроде:

EntityManager em = getEntityManagerBasedOnTable(domainObject.getClass());
// persist, etc...

Причина косвенного обращения заключается в том, что разные пользователи предъявляют разные требования. У маленького пользователя может быть только крошечная база данных, поэтому достаточно одного сервера. Большая организация может иметь огромные базы данных, поэтому мы решаем эту проблему, размещая высокопроизводительные таблицы на высокопроизводительных серверах и так далее. Также используется некоторыми пользователями для хранения конфиденциальных данных в (дорогостоящей) среде с высокой степенью безопасности при сохранении нечувствительных данных в (дешевой) среде со средней безопасностью. Так что нет единого размера, подходящего для любого подхода к базе данных. Отсюда и косвенность. Также обратите внимание, что таблицы, которые могут быть разделены, не имеют проблем с внешним ключом.

Теперь, когда я пытаюсь перейти на JPA, как я могу позволить конечным пользователям определять свою структуру базы данных? Есть ли способ программно настроить единицы сохраняемости? Включая определение новых единиц персистентности, не указанных в файле persistence.xml? Как мне достичь своей цели?

Я могу думать о следующем:

  • Заранее определите 100 или около того единиц персистентности в файле persistence.xml: "db1", "db2" и т. Д. И прочитайте программу во внешнем файле конфигурации, который применяет к ним свойства (Persistence.createEntityManagerFactory (name, properties) ). Гадкий, ограничивающий.
  • Перейти к решению, отличному от JPA (я действительно хотел бы избежать этого. Мы хотим использовать JPA из-за его основанного на стандартах характера).
  • Развертывание пользовательских JAR-файлов или создание сценариев, которые могут редактировать / изменять файл persistence.xml JAR для использования их настроек. Немного взломать наверняка.

Для чего бы то ни было, мы используем реализацию JPA Hibernate. Я искал способ настройки JPA Hibernate и не добился успеха.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Я закрываю этот вопрос, потому что нет подходящего ответа.Для тех, кто интересуется, я решил предварительно определить все возможные комбинации единиц персистентности в файле XML.

Редактировать: Сейчас 2013, и мне нужно было вернуться к этой проблеме, и оказалось, что это можно сделатьэтот.См. Требуется ли persistence.xml при работе с Spring и Hibernate? - вам не нужно использовать Spring, но основной смысл использования HibernatePersistence.createContainerEntityManagerFactory () - это ключ.

0 голосов
/ 11 марта 2011

Не уверен, что это поможет вам, но вы можете попытаться увидеть, решит ли Тейид вашу проблему. Таким образом, вы можете объединить все источники данных в одну точку (Teiid), делая ее прозрачной для вашего приложения, откуда поступают данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...