#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
боба.