Подключение к нескольким базам данных и выбор таблиц во время выполнения spring boot java

#postgresql #oracle #hibernate #jpa #jdbctemplate

#postgresql #Oracle #зимовать #jpa #jdbctemplate

Вопрос:

У меня есть случай использования, когда мне нужно подключиться к двум разным базам данных(Postgres и Oracle). Postgres уже настроен с помощью jpa. Мне нужно добавить еще одну базу данных(Oracle). В базе данных oracle мне нужно выбрать таблицы во время выполнения для вставки и удаления(поскольку таблицы не являются фиксированными). В настоящее время я передаю таблицы в файле свойств в виде списка

 oracle:  deletion:  table:  -   tableName: user  primaryKey: userId  emailField: emailId  deleteTableName: user_delete  -  tableName: customer  primaryKey: customerId  emailField: emailAddress  deleteTableName: customer_delete  

Я создал компонент, который считывает все эти свойства и помещает их в список

 @Bean("oracleTables") @ConfigurationProperties("oracle.deletion.table") Listlt;Tablegt; getAllTAbles(){  return new ArrayListlt;gt;(); }  

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

Я планирую просмотреть список таблиц, которые у меня есть в моем компоненте, и выполнить выборку, вставку и удаление.

пример фрагмента

 @Autowired @Qualifier("oracleTables") Listlt;Tablegt; tables;  public boolean processDelete(Listlt;Stringgt; emails){  for(Table table:tables){  //fetch all the primary keys for given emails from main table(value in tableName)  //insert into corresponding delete table  //delete from main table  } }  

Но у меня возникает вопрос , должен ли я использовать JdbcTemplate или JpaRepository/hibernate. И некоторая помощь в реализации, а также небольшой пример/ссылка.

Причина этого вопроса заключается в

1)Таблицы в моем случае не являются фиксированными

2)Мне нужно управление транзакциями для отката в случае сбоя при извлечении, вставке или удалении.

3)Мне нужно настроить две базы данных

Ответ №1:

должен ли я использовать JdbcTemplate или JpaRepository/hibernate

Совершенно определенно JdbcTemplate . JPA нелегко разрешить динамические таблицы.

Мне нужно управление транзакциями для отката в случае сбоя при извлечении, вставке или удалении

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

 @Bean public TransactionManager oracleTransactionManager() {  var result = new DataSourceTransactionManager();  ...  result.setDataSource(oracleDataSource());  return result; }  @Bean public TransactionManager postgresTransactionManager() {  ... }  

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

 @Transactional(transactionManager = "oracleTransactionManager") public void doWorkInOracleDb() {  ... }  

Мне нужно настроить две базы данных

Просто настройте два отдельных DataSource компонента. Конечно, на самом деле вам также понадобятся два отдельных JdbcTemplate боба.