После вызова определенной процедуры, все транзакции по Spring JPA перестают работать

Мы подключаемся к базе на 3-ей стороне, поэтому точно не знаю что делает данная процедура, вроде как заполняет данные в некоторых таблицах

Есть примерно такая сущность

@NamedStoredProcedureQuery(name = "open", procedureName = "OPEN_PROC")
@Data
@Entity
@Table(name = "first_table")
@SecondaryTable(name = "second_table")
public class ClientData {

    @Id
    @NotNull
    private String id;

    // Id from 2nd table
    @Column(name = "id", table = "second_table")
    private String chId; 

    @Column(name = "dep_id", table = "first_table")
    private String depId;

    @Column(name = "dep_id", table = "second_table")
    private String chDepId;
}

Конфиг базы:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "emf",
        transactionManagerRef = "dbTransactionManager",
        basePackages = {"com.example.client"})
public class DbConfig {

    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "emf")
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource());
        sessionFactoryBean.setPackagesToScan(entitymanagerPackagesToScan);
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", hibernateDialect);
        sessionFactoryBean.setHibernateProperties(hibernateProperties);

        return sessionFactoryBean;
    }

    @Bean(name = "dbTransactionManager")
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        transactionManager.setDataSource(dataSource());
        return transactionManager;
    }
}

И repository

public interface ClientDataRepository extends JpaRepository<ClientData, String>, JpaSpecificationExecutor<ClientData> {
    @Procedure(name = "open")
    void open();
}

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

repository.open();
List<ClientData> list = repository.findAll(specificationByFilter(filter));

Проблема в том, что с repository.open() дальнейшие запросы не работают, просто грузятся, и падают по таймауту Unable to rollback against JDBC connection

Если не использовать repository.open() все ок, но данные с некоторых таблиц приходят как нулл

Еще один нюанс в том, что при использовании данной процедуры с JdbcTemplate, и запросами через JdbcTemplate никаких проблем/ошибок нет, все отрабатывает, но мне нужно это реализовать через Spring JPA, чтобы была возможность использовать Specifications API

Подскажите пожалуйста в чем может быть проблема. Сам подозреваю, что конфиг неправильно настроил


Ответы (1 шт):

Автор решения: Денис Старакожев

Подозреваю, что проблема связана с транзакциями. При использовании template управление транзациями немного отличается.

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

Второй вариант, процедура не совместима с идеей JPA, когда данные из БД кешируются в контексте на время транзакции.

Третий вариант, происходит ошибка где то в недрах транзакшн менеджера и она поглощается подменяется в итоге на что то неинформативное. Включите детальные логи и отображение логиирование запросов + подебажить TransactionManager

Без самой процедуры конечно сложно что-то сказать.

→ Ссылка