java – JpaItemWriter:没有事务正在进行中
发布时间:2020-12-15 04:18:46 所属栏目:Java 来源:网络整理
导读:我想使用JpaItemWriter批量持久化实体.但是当我使用下面的代码来坚持时,我被告知: Hibernate: select nextval ('hibernate_sequence')[] 2014-03-19 15:46:02,237 ERROR : TransactionRequiredException: no transaction is in progress 如何启用以下事务:
我想使用JpaItemWriter批量持久化实体.但是当我使用下面的代码来坚持时,我被告知:
Hibernate: select nextval ('hibernate_sequence') [] 2014-03-19 15:46:02,237 ERROR : TransactionRequiredException: no transaction is in progress 如何启用以下事务: @Bean public ItemWriter<T> writer() { JpaItemWriter<T> itemWriter = new JpaItemWriter<>(); itemWriter.setEntityManagerFactory(emf); } @Configuration @EnableTransactionManagement @EnableBatchProcessing class Config{ { @Bean public LocalContainerEntityManagerFactoryBean emf() { LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(dataSource()); emf.setPackagesToScan("my.package"); emf.setJpaVendorAdapter(jpaAdapter()); emf.setJpaProperties(jpaProterties()); return emf; } 编辑: @Bean public Job airlineJob(JobBuilderFactory jobs,Step step) { return jobs.get("job") .start(step) .build(); } //Reader is a `FlatFileItemReader`,writer is `CustomItemWriter`. @Bean public Step step(StepBuilderFactory steps,MultiResourceItemReader<T> rea,ItemProcessor<T,T> pro,ItemWriter<T> wr) { return steps.get("step") .reader(rea) .processor(proc) .writer(wr) .build(); } //use same datasource and tx manager as in the full web application @Bean public JobLauncher launcher(TransactionManager tx,DataSource ds) throws Exception { SimpleJobLauncher launcher = new SimpleJobLauncher(); JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(ds); factory.setTransactionManager(tx); jobLauncher.setJobRepository(factory.getJobRepository()); return launcher; } 编辑2作为对@Haim的回复: @Bean public JpaItemWriter<T> jpaItemWriter(EntityManagerFactory emf) { JpaItemWriter<T> writer = new JpaItemWriter<T>(); writer.setEntityManagerFactory(emf); return writer; } 解决方法
我同意Michael Minella:Spring批处理作业存储库不喜欢与其他人共享其事务管理器.逻辑很简单,如果您在步骤失败时与步骤事务管理器共享作业事务管理器,它将回滚步骤和写入作业存储库的数据.这意味着您不会保留数据以重新启动作业.
要使用两个事务管理器,您需要: 删除@EnableTransactionManagement,以防您仅将其用于上面的@Transactional @Bean @Qualifier("jpaTrx") public PlatformTransactionManager jpaTransactionManager() { return new JpaTransactionManager(emf()); } 将事务管理器设置为您的步骤 @Autowired @Qualifier("jpaTrx") PlatformTransactionManager jpaTransactionManager //Reader is a FlatFileItemReader,writer is CustomItemWriter. @Bean public Step step(StepBuilderFactory steps,ItemWriter<T> wr) { return steps.get("step") //attach tx manager .transactionManager(jpaTransactionManager) .reader(rea) .processor(proc) .writer(wr) .build(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |