Spring批处理使用JpaPagingItemReader JpaItemWriter没有事务正在进行中

时间:2015-01-17 08:53:19

标签: jpa spring-data spring-batch

我的项目使用java config,由其他java配置文件创建的DataSource entityManagerFactory PlatformTransactionManager

ItemReader读取数据时,ItemProcessor数据转换ItemWriter有一些错误

我该如何解决这个问题?


错误消息

2015-01-17 16:26:30.390 ERROR AbstractStep:225 - Encountered an error executing step testStep in job validJob
javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)  

如何启用以下代码的交易:

  @Configuration
        @EnableBatchProcessing
        public class JobConfiguration {   

     @Inject
            private PlatformTransactionManager transactionManager;

         @Inject
            private EntityManagerFactory emf;    

         @Bean
            public Job validJob(JobBuilderFactory jobBuilderFactory,Step step) {
                return jobBuilderFactory.get("validJob").flow(step).end().build();
            }

            @Bean
            public Step testStep(StepBuilderFactory stepBuilderFactory, ItemReader<PurchaseOrder> reader,
                    ItemWriter<PurchaseOrder> writer, ItemProcessor<PurchaseOrder, PurchaseOrder> processor) {
                return stepBuilderFactory.get("testStep")//
                        .transactionManager(transactionManager)//
                        .<PurchaseOrder, PurchaseOrder>chunk(100)//
                        .reader(reader)//
                        .processor(processor)//
                        .writer(writer)//
                        .build();
            }

            @Bean
            public ItemReader<PurchaseOrder> reader() {
                JpaPagingItemReader<PurchaseOrder> reader = new JpaPagingItemReader<PurchaseOrder>();
                reader.setEntityManagerFactory(emf);
                reader.setQueryString(" select p from PurchaseOrder p ");
                reader.setTransacted(false);
                return reader;
            }

            @Bean
            public ItemProcessor<PurchaseOrder, PurchaseOrder> processor() {
                return new PurchaseOrderItemProcessor();
            }

            @Bean
                        public ItemWriter<PurchaseOrder> writer() {
                JpaItemWriter<PurchaseOrder> writer = new JpaItemWriter<PurchaseOrder>();
                writer.setEntityManagerFactory(emf);
                return writer;

            }

0 个答案:

没有答案