HibernateItemWriter в весенней пакетной программе пытается запустить без начала транзакции - PullRequest
0 голосов
/ 12 июня 2019

У меня есть подпружиненная программа, которая успешно запускает задания, которые пытаются записать данные в базу данных SQL с помощью HibernateItemWriter. Однако код гибернации завершается неудачно, потому что транзакция никогда не запускается:

org.hibernate.HibernateException: contains is not valid without active transaction

Я настроил HibernateTransactionManager, который, как я думал, должен был позаботиться об этом, но проблема сохраняется. Может быть, мои весенние конфигурации еще выключены? Вот соответствующий код из файла конфигурации:

BatchConfig.java

@Configuration
@EnableBatchProcessing
@EnableTransactionManagement
public class BatchConfig {

    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setAnnotatedClasses(Student.class);
        sessionFactory.setHibernateProperties(getProperties());
        try {
            sessionFactory.afterPropertiesSet();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sessionFactory.getObject();
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory());
        transactionManager.setDataSource(dataSource());
        return transactionManager;
    }

    @Bean
    public ItemWriter<Student> studentItemWriter() {
        HibernateItemWriter<Student> writer = new HibernateItemWriter<Student>();
        writer.setSessionFactory(sessionFactory());
        return writer;
    }
}

1 Ответ

0 голосов
/ 13 июня 2019

Я настроил HibernateTransactionManager, который, как я думал, должен был позаботиться об этом, но проблема сохраняется.Может быть, мои весенние конфигурации еще выключены?

Объявление HibernateTransactionManager как компонента в контексте приложения в недостаточной степени, оно не будет использоваться Spring Batch.Вам нужно расширить DefaultBatchConfigurer и переопределить getTransactionManager.В вашем случае это должно быть что-то вроде этого:

@Configuration
@EnableBatchProcessing
@EnableTransactionManagement
public class BatchConfig {

   @Override
   public HibernateTransactionManager getTransactionManager() {
      HibernateTransactionManager transactionManager = new HibernateTransactionManager();
      transactionManager.setSessionFactory(sessionFactory());
      transactionManager.setDataSource(dataSource());
      return transactionManager;
   }

}

Пожалуйста, обратитесь к справочной документации для получения дополнительной информации о том, как настроить компоненты инфраструктуры, необходимые для Spring Batch.

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