У меня есть программа 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 и не добился успеха.