Выполнение объединения более 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 выше.
Ответ 2
У меня нет опыта в этом, но я знаю, что Oracle поддерживает "связи" базы данных между двумя отдельными экземплярами базы данных. Может быть, эта статья поможет вам?
Публикация на форумах Hibernate об использовании ссылки Oracle между двумя экземплярами