Мы используем JPA в проекте. Spring Boot 2.
Я буду что-то делать в БД с entitymaner каждый раз, когда любая транзакция начинается, фиксируется или откатывается.
Я полагаю, мне следует использовать / расширить JpaTransactionManager. В Inte rnet я не нашел ни одного примера того, как реализовать JpaTransactionManager, который использует entitymanager.
@Configuration
@ EnableTransactionManagement publi c класс TransactionManagerConfiguration {
private final DataSource dataSource;
private final JdbcTemplate jdbcTemplate;
public TransactionManagerConfiguration(final DataSource dataSource, final JdbcTemplate jdbcTemplate) {
this.dataSource = dataSource;
this.jdbcTemplate = jdbcTemplate;
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new InterceptedDataSourceTransactionManager(this.dataSource, this.jdbcTemplate);
}
static class InterceptedDataSourceTransactionManager extends DataSourceTransactionManager {
private static final Logger LOG = LoggerFactory.getLogger(InterceptedDataSourceTransactionManager.class);
private final JdbcTemplate jdbcTemplate;
public InterceptedDataSourceTransactionManager(DataSource dataSoure, JdbcTemplate jdbcTemplate) {
super(dataSoure);
this.jdbcTemplate = jdbcTemplate;
}
/*@Override
protected void doCleanupAfterCompletion(Object transaction) {
cleanupTransaction();
super.doCleanupAfterCompletion(transaction);
}*/
@Override
protected void doBegin(Object transation, TransactionDefinition definition) {
super.doBegin(transation, definition);
final String userId = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
jdbcTemplate.update("insert into session (user_id, tx_id) values ((select id from \"vw_user\" where vw_user_id = ?), txid_current())", userId);
LOG.debug("transaction session started as user {}", userId);
}
@Override
protected void doCommit(DefaultTransactionStatus status) {
status.flush();
cleanupTransaction();
super.doCommit(status);
}
@Override
protected void doRollback(DefaultTransactionStatus status) {
cleanupTransaction();
super.doRollback(status);
}
private void cleanupTransaction() {
jdbcTemplate.update("delete from session");
LOG.debug("transaction session ended");
}
}
}
Код работает, когда JDBCTemplate используется в проекте, но не для Jpa. Цель состоит в том, чтобы: я хотел бы заполнить таблицу сеансов данными в начале транзакции, использовать данные различными триггерами и в конце транзакции удалить данные из таблицы сеансов до совершения транзакции.
Причина: некоторые данные доступны для анализа только в коде Java, и я хотел бы, чтобы триггеры использовали данные в транзакции, и поэтому я использую дополнительную таблицу "сеансов".
Полагаю, , может быть, мне стоит использовать JpaTransactionmanager с Entitymanager?
Может ли кто-нибудь помочь мне или дать какой-нибудь совет?
Спасибо!