我正在使用弹簧批。当我要更新 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
这是我的代码:
我的应用程序属性
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
这里是批量配置:
@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);
}
}
这是我的读者存储库:
@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();
}
这是我的更新操作仓库:
@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。但是序列化不显示,但任何更新操作都会显示此错误。
为什么它显示在错误上方?
请帮助我...
由于您使用 JPA 存储库来写入/更新项目,因此您需要配置
JpaTransactionManager
而不是 DataSourceTransactionManager
。
将
transactionManager
bean 更改为 JpaTransactionManager
,它应该可以解决您的问题。