如何修复spring批处理中没有正在进行的事务
当我尝试使用spring批处理中的作业处理器将从csv文件恢复的一些数据持久化到数据库中时,此错误会出现在控制台中,对于我的dao,我使用的是hibernate 我已经试过两种方法,但同样的问题 第一:如何修复spring批处理中没有正在进行的事务,spring,spring-batch,Spring,Spring Batch,当我尝试使用spring批处理中的作业处理器将从csv文件恢复的一些数据持久化到数据库中时,此错误会出现在控制台中,对于我的dao,我使用的是hibernate 我已经试过两种方法,但同样的问题 第一: Session session = factory.getCurrentSession(); session.saveOrUpdate(p); 第二: Session session = factory.openSession(); session.beginT
Session session = factory.getCurrentSession();
session.saveOrUpdate(p);
第二:
Session session = factory.openSession();
session.beginTransaction();
session.save(p);
session.getTransaction().commit();
session.close();
my spring xml配置中的数据源:
我所有的SpringXML配置都在这里
tp.entities.Personne
org.hibernate.dialogue.mysql5dialogue
真的
更新
错误:
javax.persistence.TransactionRequiredException:没有正在进行的事务
在org.hibernate.internal.SessionImpl.CheckTransactionRequired(SessionImpl.java:3450)上
位于org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1418)
位于org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1414)
…您将Spring批处理配置为使用
DataSourceTransactionManager
来驱动事务。此事务管理器对您的Hibernate上下文一无所知。您需要使用HibernateTransactionManager
使writer中的Hibernate会话参与Spring批处理管理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
我还建议使用HibernateItemWriter
,而不是创建自定义编写器(PersonWriter
),手动创建会话和管理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
类似的问题/答案可在此处找到:
希望这有帮助。您已将Spring批处理配置为使用DataSourceTransactionManager
来驱动事务。此事务管理器对您的Hibernate上下文一无所知。您需要使用HibernateTransactionManager
使writer中的Hibernate会话参与Spring批处理管理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
我还建议使用HibernateItemWriter
,而不是创建自定义编写器(PersonWriter
),手动创建会话和管理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
类似的问题/答案可在此处找到:
希望这能有所帮助。当我们在spring boot项目中特别为tasklet使用spring batch时,@EnableBatchProcessing
注释将为其默认表创建自己的事务(spring batch事务)。
因此,如果要在应用程序表中执行任何插入、更新或删除操作(acutal table performingCRUD
)。我们必须明确提到JpaTransactionManager
,而不是默认的spring批处理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
@Primary是最重要的一个,另外将加载两个事务管理器。在工作中提到jpaTransactionManager()
return stepBuilderFactory.get("stepOne")
.transactionManager(jpaTransactionManager())
.<DetailDTO,DetailDTO>chunk(100)
.reader(reportReader)
.processor(reportProcessor)
.writer(reportWriter)
.build();
返回stepBuilderFactory.get(“stepOne”)
.transactionManager(jpaTransactionManager())
.chunk(100)
.reader(reportReader)
.处理器(报表处理器)
.作者(报告作者)
.build();
我得到的错误-由以下原因引起:javax.persistence.TransactionRequiredException:没有正在进行的事务
如果这对您有用,请单击“向上投票”。当我们在spring boot项目中特别为tasklet使用spring batch时,@EnableBatchProcessing
注释将为其默认表创建自己的事务(spring batch事务)。
因此,如果要在应用程序表中执行任何插入、更新或删除操作(acutal table performingCRUD
)。我们必须明确提到JpaTransactionManager
,而不是默认的spring批处理事务
@Configuration
@EnableBatchProcessing
public class MyJob extends DefaultBatchConfigurer {
@Autowired
private DataSource dataSource;
@Bean
@Primary
public JpaTransactionManager jpaTransactionManager() {
final JpaTransactionManager tm = new JpaTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
@Primary是最重要的一个,另外将加载两个事务管理器。在工作中提到jpaTransactionManager()
return stepBuilderFactory.get("stepOne")
.transactionManager(jpaTransactionManager())
.<DetailDTO,DetailDTO>chunk(100)
.reader(reportReader)
.processor(reportProcessor)
.writer(reportWriter)
.build();
返回stepBuilderFactory.get(“stepOne”)
.transactionManager(jpaTransactionManager())
.chunk(100)
.reader(reportReader)
.处理器(报表处理器)
.作者(报告作者)
.build();
我得到的错误-由以下原因引起:javax.persistence.TransactionRequiredException:没有正在进行的事务
如果这对您有用,请单击“向上投票”。1。因为您使用的是Hibernate,所以应该使用HibernateTransactionManager。2.因为您使用的是基于注释的事务,所以应该是事务性的bean方法应该用@transactional
注释。我添加了注释@Transactional public void savePersonne(Personne p){Session Session=factory.getCurrentSession();Session.saveOrUpdate(p);},但问题仍然存在。显然,您阅读了我评论的第二部分,但没有阅读第一部分。如何使用HibernateTransactionManager?如我在第一条评论中发布的链接所示。因为您使用的是Hibernate,所以应该使用HibernateTransactionManager。2.因为您使用的是基于注释的事务,所以应该是事务性的bean方法应该用@transactional
注释。我添加了注释@Transactional public void savePersonne(Personne p){Session Session=factory.getCurrentSession();Session.saveOrUpdate(p);},但问题仍然存在。显然,您阅读了我评论的第二部分,但没有阅读第一部分。如何使用HibernateTransactionManager?正如我在第一条评论中发布的链接所示。感谢我使用HibernateTransactionManager,它可以工作:所以我们只需要创建bean,rest spring会处理吗?或者我们需要在运行时指定它吗jobs@user124创建事务管理器bean是不够的。如果要使用自定义事务管理器,请