Кросс-база данных объединяется в JPA

Можно ли выполнять соединения таблиц кросс-базы данных в JPA?

У меня есть таблица users в одной базе данных, которая имеет внешний ключ для таблицы organizations в отдельной базе данных. Обе базы данных находятся на одной физической машине. Теперь MySQL позволяет мне писать запросы, охватывающие несколько баз данных, но я не знаю, как это сделать с помощью JPA.

Аннотации @Entity в Java POJO не берут имя базы данных, поэтому нет возможности отметить связь между БД.

Есть ли обходной путь для этой ситуации? Возможно, используя собственный запрос для загрузки объединенного объекта?


person Abhinav Sarkar    schedule 02.05.2011    source источник


Ответы (3)


Мы опробовали следующий подход и, похоже, он работает.

1) Нет атрибута схемы в аннотациях @Table

2) создавать разные файлы формы для сущностей, объединенных схемой, в которой они присутствуют.

3) В каждый из файлов orm вы можете добавить «my_schema».

4) Включите файлы orm в соответствующих PU в файл persistence.xml.

5) И если вы хотите разные базы данных во время тестов, создайте аналогичные orm-файлы для теста и соответственно измените значение в схеме и включите эти orm-файлы в отдельный PU

ХТН

person Abhilash L L    schedule 29.09.2011

Если MySQL позволяет вам писать SQL для этого запроса в базе данных, вы можете использовать этот SQL в собственном запросе в JPA.

Я предполагаю, что вы используете какой-то механизм связывания базы данных? Если это так, то вы также должны иметь возможность отобразить это. Вы можете установить «схему» в своей @Table связанной базы данных на имя ссылки.

i.e.

@Table(name="organizations", schema="org_schema@org_db")
person James    schedule 02.05.2011
comment
+1 Вау, я этого не знал. Это облегчило бы мне жизнь в моем предыдущем проекте. Спасибо, Джеймс! - person Augusto; 03.05.2011

Вы не можете. Поскольку каждый объект привязан к контексту сохранения, а контекст привязан к базе данных.

Если под базами данных вы подразумеваете схемы на одном сервере, вы можете сделать 2 вещи

  • создать представление на одной из схем, указав на таблицу на другой схеме. Недостатком является то, что вам может потребоваться сопоставить сущность дважды (по одному разу для каждой схемы).
  • Создайте представление с объединением и сопоставьте оттуда любые нужные вам значения. Недостатком является то, что сущность будет доступна только для чтения.

Если обе схемы находятся в разных базах данных, вам придется выполнять объединение вручную в коде.

Один вопрос к вам. Упомянутый вами «внешний ключ» является реальным внешним ключом БД или логическим FK?

person Augusto    schedule 02.05.2011
comment
Это логический ФК. А базы данных — это настоящие отдельные базы данных MySQL, хотя и на одной физической машине. - person Abhinav Sarkar; 02.05.2011
comment
Вы не сможете выполнить присоединение по указанным выше причинам. Это может иметь смысл, если вы пытаетесь читать из БД, которые управляются из разных приложений или служб (если вы делаете что-то, связанное с SOA). Решение состоит в том, чтобы выполнить соединение в вашем коде. - person Augusto; 02.05.2011
comment
Я выбрал первый подход, и он сработал. Я также проверил производительность запроса на соединение для представления по сравнению с аналогичными показателями для таблиц отдельных баз данных, и они оказались практически одинаковыми. - person Abhinav Sarkar; 03.05.2011