-1

I'm trying to run a job using Spring Batch 5 using h2 embeded db but i continue having a problem. Seems the spring batch h2 databse script isn't loaded.

This is my configuration class:

package ****.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.val;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration;
import org.springframework.batch.core.configuration.support.MapJobRegistry;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.TaskExecutorJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Role;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class BatchConfig extends DefaultBatchConfiguration {
 @Bean(name = "batchDB")
 public DataSource batchDataSource() {
 return new EmbeddedDatabaseBuilder()
 .setType(EmbeddedDatabaseType.H2)
 .setName("batchDB")
 .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
 .addScript("classpath:org/springframework/batch/core/schema-h2.sql")
 .build();
 }
 @Autowired
 @Qualifier("batchDB")
 private DataSource batchDB;
 @Override
 protected DataSource getDataSource() {
 return batchDB; 
 }
 @Override
 protected PlatformTransactionManager getTransactionManager() {
 return new DataSourceTransactionManager(batchDB);
 }
}

When i try run the service, it seems working but then i'm having this error:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT VERSION
FROM BATCH_JOB_EXECUTION
WHERE JOB_EXECUTION_ID=?
]
 at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:103)
 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
 at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1548)
 at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:677)
 at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:723)
 at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:754)
 at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:767)
 at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:889)
 at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:916)
 at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.synchronizeStatus(JdbcJobExecutionDao.java:394)
 at org.springframework.batch.core.repository.support.SimpleJobRepository.update(SimpleJobRepository.java:194)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:568)
 at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
 at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379)
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
 at jdk.proxy2/jdk.proxy2.$Proxy165.update(Unknown Source)
 at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:376)
 at org.springframework.batch.core.launch.support.SimpleJobLauncher1ドル.run(SimpleJobLauncher.java:157)
 at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
 at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:148)
 at org.springframework.batch.core.launch.support.TaskExecutorJobLauncher.run(TaskExecutorJobLauncher.java:59)
 at ***.config.JobRunnerConfig.run(JobRunnerConfig.java:44)
 at org.springframework.boot.SpringApplication.lambda$callRunner4ドル(SpringApplication.java:786)
 at org.springframework.util.function.ThrowingConsumer1ドル.acceptWithException(ThrowingConsumer.java:82)
 at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60)
 at org.springframework.util.function.ThrowingConsumer1ドル.accept(ThrowingConsumer.java:86)
 at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798)
 at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:786)
 at org.springframework.boot.SpringApplication.lambda$callRunners3ドル(SpringApplication.java:774)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
 at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
 at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
 at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
 at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
 at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:342)
 at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149)
 at ***.PhaseOutCompressionJobApplication.main(PhaseOutCompressionJobApplication.java:45)
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BATCH_JOB_EXECUTION" not found (this database is empty); SQL statement:
SELECT VERSION
FROM BATCH_JOB_EXECUTION
WHERE JOB_EXECUTION_ID=?
 [42104-224]
 at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
 at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
 at org.h2.message.DbException.get(DbException.java:223)
 at org.h2.message.DbException.get(DbException.java:199)
 at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8051)
 at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8035)
 at org.h2.command.Parser.readTableOrView(Parser.java:8024)
 at org.h2.command.Parser.readTablePrimary(Parser.java:1788)
 at org.h2.command.Parser.readTableReference(Parser.java:2268)
 at org.h2.command.Parser.parseSelectFromPart(Parser.java:2718)
 at org.h2.command.Parser.parseSelect(Parser.java:2824)
 at org.h2.command.Parser.parseQueryPrimary(Parser.java:2708)
 at org.h2.command.Parser.parseQueryTerm(Parser.java:2564)
 at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2543)
 at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2536)
 at org.h2.command.Parser.parseQueryExpression(Parser.java:2529)
 at org.h2.command.Parser.parseQuery(Parser.java:2498)
 at org.h2.command.Parser.parsePrepared(Parser.java:627)
 at org.h2.command.Parser.parse(Parser.java:592)
 at org.h2.command.Parser.parse(Parser.java:564)
 at org.h2.command.Parser.prepareCommand(Parser.java:483)
 at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639)
 at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:559)
 at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166)
 at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:93)
 at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:316)
 at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1711)
 at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:656)

Seems the h2 database is never loaded. I'm migrating from Spring Batch 4 to 5 but i think i made every change. I'm not using the annotation @EnableBatchProcessing and i'm extending DefaultBatchConfiguration class. The works run correctly until i'm meeting this. Can someone help me? I already checked here Spring Batch 5 is not autocreating table in H2 database but i didn't find a solution.

asked Dec 11, 2025 at 15:17
1
  • How many instances of the following do you have in your application; DataSource, PlatformTransactionManager , JdbcTemplate? Also, keep in mind the PlatformTransactionManager you define there is not a Spring Managed Bean. Commented Dec 12, 2025 at 9:39

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.