I am using spring batch. When I am going to update any row from witter, it shows below error:
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
Here is my code:
-
my application.properties
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
-
Here is Batch configuration:
@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); } }
-
Here is my reader repository:
@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(); }
-
Here is my update operation repository:
@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); }
But any update operation show above error.
Note : I have serialization error , for this reason I have used BatchBean. But serialization does not show , but any update operation show this error.
Why it shows above the error?
Please help me…