Определение динамической конфигурации базы данных с помощью JPA

#jpa

#jpa

Вопрос:

Согласно спецификации JPA a persistence.xml требуется указать имя модуля сохранения, тип транзакции JTA (поскольку я буду использовать его в контейнере Java EE), имя источника данных, идентификатор пользователя и пароль.

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

Мой запрос касается единственного экземпляра сервера, обслуживающего несколько баз данных, у меня разные источники данных в зависимости от региона, который будет обслуживать приложение, поэтому я хочу иметь возможность определять источник данных во время выполнения, а не во время компиляции с использованием persistence.xml .

Я пытался использовать Persistence API для создания фабрики entity manager, но этот метод, похоже, не требуется ни для одного контейнера для обеспечения поддержки.

Хотя я хотел бы следовать спецификации jee при определении уровня сохраняемости, этот конкретный элемент возможности обращаться к нескольким источникам данных во время выполнения не выглядит как готовая функция, предоставляемая JPA.

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

Комментарии:

1. Какой сервер приложений вы используете? Должно ли ваше приложение быть переносимым на другие продукты сервера приложений?

2. Привет, Саймон, я использую Websphere, и в будущем мне потребуется, чтобы мое приложение было переносимым.

3. Я думаю, что это возможно «только» с несколькими блоками сохранения, с одинаковой конфигурацией, но с другим источником данных. С помощью CDI вы можете сделать их доступными через методы производителя, посредством которых EntityManagers создаются для разных квалификаторов. Вы могли бы получить их через экземпляр<EntityManager> emInstances и выбрать их по их квалификатору, при этом квалификатор предоставляется другим компонентом, который знает о текущем регионе. Не совсем то, что вы просили, но на это стоит обратить внимание: antoniogoncalves.org/2014/05/25 /…