Модифицируйте схему JPA во время выполнения с EclipseLink, работающим на JBoss - PullRequest
1 голос
/ 03 апреля 2012

Я новичок в JPA и JBoss, поэтому извините заранее, если это глупый вопрос.

У меня есть приложение, работающее на JBoss с использованием EclipseLink, которое извлекает объекты из различных баз данных на основе строки JPQL.Это прекрасно работает, за исключением того, что одна база данных содержит несколько схем.Я хотел бы иметь возможность указать, какую схему использовать во время выполнения, и выбрать все объекты, которые принадлежат этой схеме, без изменения строки JPQL.

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

После некоторого поиска я наткнулся на это:

JPA: как указатьимя таблицы, соответствующее классу во время выполнения?

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

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

Есть ли способ решить эту проблему?Я что-то упустил или это толкает JPA за пределы того, для чего он был предназначен?

1 Ответ

3 голосов
/ 03 апреля 2012

У вас должна быть другая единица персистентности для каждой схемы.Вы можете использовать те же классы / сопоставления, вам просто понадобится файл orm.xml, который определяет другую схему по умолчанию.В этом файле больше ничего не нужно, вы все равно можете отобразить свои объекты в аннотациях или в отдельном файле orm.xml.

Чтобы иметь единицу сохранения с некоторыми объектами в одной схеме, а некоторые вдругой, вы снова можете сделать это в файле orm.xml.Вам просто нужно будет включить сущности, которые используют схему не по умолчанию, в файл orm.xml.EclipseLink всегда объединяет аннотации и XML, поэтому вы можете использовать оба и иметь только те дополнения, которые вам нужны в xml.

EclipseLink также позволяет вам устанавливать tableQualifier, который определяет схему по умолчанию.Это можно установить с помощью SessionCutsomizer при входе в сеанс.

...