gpt4 book ai didi

java - 使用 Spring Batch 进行事务管理

转载 作者:行者123 更新时间:2023-12-01 17:42:29 65 4
gpt4 key购买 nike

我实际上发现了 Spring 并且我能够设置一些工作。现在,我想使用 Hibernate/JPA 将导入的数据保存在数据库中,但我不断收到此错误:

14:46:43.500 [main] ERROR o.s.b.core.step.AbstractStep   - Encountered an error executing the step javax.persistence.TransactionRequiredException: no transaction is in progress

我发现问题出在交易上。这是我的 entityManagertransactionManager 的 spring java 配置:

 @Configuration
public class PersistenceSpringConfig implements EnvironmentAware
{


@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception
{
// Initializes the entity manager
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.setDataSource(dataSource());

// Scans the database model
factoryBean.setPackagesToScan(EntiteJuridiqueJPA.class.getPackage().getName());

// Defines the Hibernate properties
Properties jpaProperties = new Properties();
jpaProperties.setProperty("hibernate.show_sql", "false");
jpaProperties.setProperty("hibernate.format_sql", "false");
String connectionURL = "jdbc:h2:file:" + getDatabaseLocation();
jpaProperties.setProperty("hibernate.connection.url", connectionURL);
jpaProperties.setProperty("hibernate.connection.username", "sa");
jpaProperties.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
jpaProperties.setProperty("hibernate.dialect", H2Dialect.class.getName());
jpaProperties.setProperty("hibernate.hbm2ddl.auto", "create");
jpaProperties.setProperty("hibernate.hbm2ddl.import_files_sql_extractor", "org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor");
jpaProperties.setProperty("hibernate.hbm2ddl.import_files",
"org/springframework/batch/core/schema-drop-h2.sql,org/springframework/batch/core/schema-h2.sql");

factoryBean.setJpaProperties(jpaProperties);
return factoryBean;
}



@Bean
public PlatformTransactionManager transactionManager2() throws Exception
{
EntityManagerFactory object = entityManagerFactory().getObject();
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(object);
return jpaTransactionManager;
}

我正在使用JpaItemWriter将数据存储在数据库中:

 @Bean
public ItemWriter<EntiteJuridiqueJPA> writer()
{
JpaItemWriter<EntiteJuridiqueJPA> writer = new JpaItemWriter<EntiteJuridiqueJPA>();
writer.setEntityManagerFactory(entityManagerFactory.getObject());
return writer;
}

这是导致异常的代码:javax.persistence.TransactionRequiredException:没有事务正在进行

知道如何解决这个问题吗?

[编辑]我还添加了作业定义和步骤定义。我所有的 Spring 配置都是用 Java 编写的。

 @Configuration
@EnableBatchProcessing
@Import(PersistenceSpringConfig.class)
public class BatchSpringConfig
{
@Autowired
private JobBuilderFactory jobBuilders;

@Autowired
private StepBuilderFactory stepBuilders;

@Autowired
private DataSource dataSource;

@Autowired
private LocalContainerEntityManagerFactoryBean entityManagerFactory;

@Bean
public Step step()
{
return stepBuilders.get("step").<EntiteJuridique, EntiteJuridiqueJPA> chunk(5).reader(cvsReader(null))
.processor(processor()).writer(writer()).listener(processListener()).build();
}

@Bean
@StepScope
public FlatFileItemReader<EntiteJuridique> cvsReader(@Value("#{jobParameters[input]}") String input)
{
FlatFileItemReader<EntiteJuridique> flatFileReader = new FlatFileItemReader<EntiteJuridique>();
flatFileReader.setLineMapper(lineMapper());
flatFileReader.setResource(new ClassPathResource(input));
return flatFileReader;
}

@Bean
public LineMapper<EntiteJuridique> lineMapper()
{
DefaultLineMapper<EntiteJuridique> lineMapper = new DefaultLineMapper<EntiteJuridique>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setDelimiter(";");
lineTokenizer.setNames(new String[] { "MEGA_ENTITE", "PORTEFEUILLE", "MEGA_ENTITE", "Libellé" });

BeanWrapperFieldSetMapper<EntiteJuridique> fieldSetMapper = new BeanWrapperFieldSetMapper<EntiteJuridique>();
fieldSetMapper.setTargetType(EntiteJuridique.class);

lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);

return lineMapper;
}

@Bean
public Job dataInitializer()
{
return jobBuilders.get("dataInitializer").listener(protocolListener()).start(step()).build();
}

@Bean
public ItemProcessor<EntiteJuridique, EntiteJuridiqueJPA> processor()
{
return new EntiteJuridiqueProcessor();
}

@Bean
public ItemWriter<EntiteJuridiqueJPA> writer()
{
JpaItemWriter<EntiteJuridiqueJPA> writer = new JpaItemWriter<EntiteJuridiqueJPA>();
writer.setEntityManagerFactory(entityManagerFactory.getObject());
return writer;
// return new EntiteJuridiqueWriter();
}

@Bean
public ProtocolListener protocolListener()
{
return new ProtocolListener();
}

@Bean
public CSVProcessListener processListener()
{
return new CSVProcessListener();
}

@Bean
public PlatformTransactionManager transactionManager2() throws Exception
{
EntityManagerFactory object = entityManagerFactory.getObject();
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(object);
return jpaTransactionManager;
}

[编辑]我仍然被这个问题困扰。我遵循@Sean Patrick Floyd 和@bellabax 的建议,为stepBuilders 设置事务管理器,但我仍然遇到相同的异常。我已经独立于 spring-batch 测试了我的entityManager,并且我能够在数据库中存储任何数据。

但是,当将相同的实体管理器与 Spring Batch 一起使用时,我遇到了这个异常。

任何人都可以提供更多有关如何在 Spring Batch 中管理事务的见解吗?谢谢您的帮助?

最佳答案

问题是您正在创建第二个事务管理器 (transactionManager2),但 Spring Batch 正在使用另一个事务管理器来启动事务。如果您使用 @EnableBatchProcessing,Spring Batch 会自动注册一个事务管理器以用于其事务,并且您的 JpaTransactionManager 永远不会被使用。如果要更改 Spring Batch 用于事务的事务管理器,则必须实现 BatchConfigurer 接口(interface)。看看这个例子:https://github.com/codecentric/spring-batch-javaconfig/blob/master/src/main/java/de/codecentric/batch/configuration/WebsphereInfrastructureConfiguration.java 。这里我将事务管理器切换为WebspherUowTransactionManager,并且以同样的方式,您可以将事务管理器切换为其他事务管理器。这是解释它的博客文章的链接:http://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-3-profiles-and-environments/

关于java - 使用 Spring Batch 进行事务管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60928303/

65 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com