#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 /…