InvalidDataAccessApiUsageException:在 Spring 批处理中执行更新/删除查询

问题描述 投票:0回答:1

我正在使用弹簧批。当我要更新 witter 的任何行时,它显示以下错误:

        org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:400)
        .......

    Caused by: jakarta.persistence.TransactionRequiredException: Executing an update/delete query
        at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:471)
        at org.hibernate.query.spi.AbstractQuery.executeUpdate(AbstractQuery.java:633)
    .......
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
        ... 48 common frames omitted

这是我的代码:

  1. 我的应用程序属性

    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521/testdb
    spring.datasource.username=test
    spring.datasource.password=test
    
    logging.level.root=INFO
    logging.level.org.hibernate.stat=DEBUG
    logging.level.org.hibernate.SQL=DEBUG
    spring.jpa.properties.hibernate.jdbc.batch_size = 2000
    spring.jpa.properties.hibernate.order_updates=true
    spring.batch.job.chunk.size=10
    
    
    #update for serialization
    spring.datasource.hikari.isolation=READ_COMMITTED
    spring.batch.jdbc.schema=always
    spring.batch.jdbc.initialize-schema=always
    spring.batch.jdbc.isolation-level-for-create=read_committed
    spring.datasource.hikari.maximumPoolSize=10
    
  2. 这里是批量配置:

    @Configuration
    public class BatchBean {
       .......
    
       @Bean
        public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception {
            JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean();
            jobRepositoryFactoryBean.setDataSource(dataSource);
            jobRepositoryFactoryBean.setTransactionManager(transactionManager);
            jobRepositoryFactoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
    
            jobRepositoryFactoryBean.afterPropertiesSet();
            return jobRepositoryFactoryBean.getObject();
        }
    
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
    }
    
  3. 这是我的读者存储库:

    @Transactional
    @Repository
    public interface ApprovedTrxSummaryRepo extends JpaRepository<ApprovedTrxSummery, Long> {
    
        @Query(value = "SELECT * FROM mytable WHERE STATUS = 17 AND  TRUNC(INSERT_DATE) = TRUNC(SYSDATE) FOR UPDATE", nativeQuery = true)
        List<ApprovedTrxSummery> getAllTransaction();
    
    }
    
  4. 这是我的更新操作仓库:

    @Transactional
    @Repository
    public interface ApprovedTrxSummaryRepo extends JpaRepository<ApprovedTrxSummery, Long> {
    
         @Modifying
        @Query(value = "update approved_trx_summery set STATUS = 2 where STATUS= 44 and TRANSACTION_REFERENCE = ?1", nativeQuery = true)
        public void updateSegmentedTransaction(String transactionReference);
    }
    

但是任何更新操作都会显示上述错误。

注意:我有序列化错误,因此我使用了 BatchBean。但是序列化不显示,但任何更新操作都会显示此错误。

为什么它显示在错误上方?

请帮助我...

spring-boot spring-data-jpa spring-batch
1个回答
0
投票

由于您使用 JPA 存储库来写入/更新项目,因此您需要配置

JpaTransactionManager
而不是
DataSourceTransactionManager

transactionManager
bean 更改为
JpaTransactionManager
,它应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.