Пример использования JpaTransactionManager с entitymanager - PullRequest
0 голосов
/ 02 апреля 2020

Мы используем 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?

Может ли кто-нибудь помочь мне или дать какой-нибудь совет?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...