Получение информации для одного и того же DTO из двух разных баз данных

Я попытался сделать это максимально простым с помощью короткого примера.

У нас есть две базы данных: одна в MSSQLServer и другие в процессе. У нас есть пользовательский DTO, как следует, что мы показываем в таблице пользовательского интерфейса в веб-приложении.

User

int, id
String, name
String, accountNumber
String, street
String, city
String, country

Теперь этот DTO (Entity) не сохраняется только в одной базе данных, некоторая информация (поля) для одного и того же пользователя хранится в одной базе данных, а другая в другой базе данных.

MSsql

Table user
int, id
String, name
String, accountNumber


Table userModel
int, id
String, street
String, city
String, country

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

У нас есть требование для сортировки таблицы UI для каждого столбца. Очевидно, нам нужно создать user dto с информацией, поступающей из обеих баз данных.

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

Порядок базы данных может измениться в зависимости от того, в каком столбце (поле) пользователь хочет применить сортировку.

Технически мы создадим jparepository, который действует как фасад и в зависимости от поля сделает процесс в правильной базе данных.

Мой вопрос: Существует какой-то шаблон, который обычно используется в этих сценариях, мы используем spring, поэтому, возможно, spring имеет некоторые из функций, поддерживающих это требование, будет отлично, если это возможно с помощью jparepositories (у меня есть несколько сомнений в этом, так как мы будем использовать два разных сущности-менеджеров, по одному для каждой базы данных).

Примечание. Перенос данных из одной базы данных в другую не является параметром.

Ответы

Ответ 1

Для этого вам нужно иметь отдельный DataSource/EntityManagerFactory/JpaRepository.

В этой структуре Spring существует нет встроенной поддержки этой архитектуры, но вы можете легко скрыть двойную пару DataSource за слоем службы. Вы можете даже настроить JTA DataSources для операций ACID.

Ответ 2

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

Итак, суммируем:

1- Задайте два sql-запроса для двух баз данных, чтобы ваши пользователи

2- Создайте объекты пользователя с помощью полученных значений

3 - Используйте Java-компараторы для сортировки пользователей в любом поле без необходимости ввода новых запросов в базу данных.

Ответ 3

Моим советом было бы найти способ связать 2 базы данных вместе, чтобы вы могли использовать функции драйвера базы данных без влияния вашего кода.

По существу, если база данных Progress может быть связана с SQL Server, вы сможете запросить обе базы данных с использованием единого SQL-запроса с столбцом join on id, и вы получите объединенный, отсортированный и разбитый на выбор результат для вашего приложения для отображения.

Я не эксперт в базе данных Progress, но, похоже, для него есть драйвер ODBC, поэтому вы можете попробовать связать его с SQL Server.