Выполнение объединения более 2 таблиц в разных базах данных с использованием Hibernate

У меня есть две таблицы в двух отдельных базах данных Oracle (не схемах), которые мне нужно объединить в Hibernate. В настоящее время у меня есть две сессии Hibernate, выходящие в отдельные базы данных. Прежде чем кто-либо скажет, посмотрите на Hibernate Shards, я потратил большую часть дня, рассматривая этот подпроект и обнаружил, что: он предназначен для данных с горизонтальным разделением (все таблицы должны быть во всех базы данных AFAIK), нельзя сказать Shards искать только в одной базе данных (Hibernate Shards Docs), и над ним больше не работает.

Вещи, о которых я думал, чтобы попытаться решить эту проблему:

  • Выполнение findAll() или некоторого ограниченного варианта этого в обеих таблицах и ручное объединение с использованием нескольких циклов. (Хорошо для очень маленьких столов - запретить от маленьких столиков вверх)

  • Пусть сеансы будут взаимодействовать друг с другом (я понятия не имею, возможно ли это вообще сделать - придется взглянуть на Hibernate Session API)

  • Извлеките имя базы данных из строки URL другого hibernate-xxxx.cfg.xml и вставьте их в отдельные файлы hbm.xml, например, так:
    <class name="foo" table="foo_table" schema="foo_schema" catalog="foo_db">
    (Судя по моим первоначальным тестам, это не сработало, и это похоже на дыру в безопасности грузовика)

  • Используйте шаблон репозитория (не уверен, достаточно ли силен мой Java-Fu)

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

Ответ 1

К сожалению, у вас есть пара проблем.

  • Hibernate не поддерживает объединение нескольких "физических" экземпляров базы данных
  • Изначально большинство баз данных не поддерживают объединение нескольких "физических" экземпляров базы данных

По сути, БД хороши/эффективны только при объединении таблиц, которые находятся в одной базе данных. Существуют способы объединения баз данных, но если размер обеих таблиц велик, это может стать проблемой, и производительность может пострадать. Попробуйте поискать "соединение оракула через базу данных", и вы найдете несколько советов о том, как это сделать, но это связано с тем, что Oracle создает виртуальную связь между одной БД и другой.

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

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