Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复spring批处理中没有正在进行的事务_Spring_Spring Batch - Fatal编程技术网

如何修复spring批处理中没有正在进行的事务

如何修复spring批处理中没有正在进行的事务,spring,spring-batch,Spring,Spring Batch,当我尝试使用spring批处理中的作业处理器将从csv文件恢复的一些数据持久化到数据库中时,此错误会出现在控制台中,对于我的dao,我使用的是hibernate 我已经试过两种方法,但同样的问题 第一: Session session = factory.getCurrentSession(); session.saveOrUpdate(p); 第二: Session session = factory.openSession(); session.beginT

当我尝试使用spring批处理中的作业处理器将从csv文件恢复的一些数据持久化到数据库中时,此错误会出现在控制台中,对于我的dao,我使用的是hibernate

我已经试过两种方法,但同样的问题

第一:

    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 performing
CRUD
)。我们必须明确提到
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 performing
CRUD
)。我们必须明确提到
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是不够的。如果要使用自定义事务管理器,请