Изменение схемы JPA во время выполнения с EclipseLink, работающим на JBoss

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

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

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

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

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

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

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

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


person user1309663    schedule 03.04.2012    source источник


Ответы (1)


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

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

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

person James    schedule 03.04.2012
comment
Это означает, что я должен определить новый файл orm.xml в новой единице персистентности для каждой уникальной комбинации схем, верно? Я надеялся избежать этого, так как это приведет к множеству единиц сохраняемости и файлам orm.xml. - person user1309663; 04.04.2012
comment
Можно ли каким-то образом получить ссылку на текущий настройщик сеанса или изменить квалификатор таблицы во время выполнения? Что-то вроде: DatabaseLogin login = server.getLogin(); login.setTableQualifier("MySchema"); session = server.acquireClientSession(login); К сожалению, это не работает. - person user1309663; 04.04.2012
comment
изменить конфигурацию общего доступа в параллельной/разделяемой системе никогда не бывает хорошей идеей. Если бы у вас был другой пользователь базы данных, который по умолчанию использовал каждую другую схему, вам просто нужно было бы передать имя пользователя в свойствах pu при создании emf. - person James; 04.04.2012
comment
Спасибо, Джеймс. К сожалению, я не могу изменить базу данных. У меня проблемы с тем, что он не находит разные файлы orm (они просто игнорируются), и в любом случае он использует схему по умолчанию. Итак, я переместил файл persistence.xml и все классы сущностей в отдельный файл jar (конфиг был в файле EAR, и я ссылался на него через файл jar и подумал, что, возможно, это заставляет его искать файлы orm в неправильное место). Это вернуло меня на шаг назад, теперь он даже не может найти сущности, даже если они являются ссылками в элементах класса. - person user1309663; 10.04.2012