diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JpaPagingItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JpaPagingItemReader.java index a48082842..43a7fe508 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JpaPagingItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JpaPagingItemReader.java @@ -57,6 +57,8 @@ import org.springframework.util.ClassUtils; public class JpaPagingItemReader extends AbstractPagingItemReader { private EntityManagerFactory entityManagerFactory; + + private EntityManager entityManager; private final Map jpaPropertyMap = new HashMap(); @@ -95,18 +97,25 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { } @Override - @SuppressWarnings("unchecked") - protected void doReadPage() { - - EntityManager entityManager = - entityManagerFactory.createEntityManager(jpaPropertyMap); + protected void doOpen() throws Exception { + super.doOpen(); + entityManager = + entityManagerFactory.createEntityManager(jpaPropertyMap); if (entityManager == null) { throw new DataAccessResourceFailureException("Unable to obtain an EntityManager"); } + } + + @Override + @SuppressWarnings("unchecked") + protected void doReadPage() { EntityTransaction tx = entityManager.getTransaction(); tx.begin(); + entityManager.flush(); + entityManager.clear(); + Query query = entityManager.createQuery(queryString) .setFirstResult(page * pageSize) .setMaxResults(pageSize); @@ -118,10 +127,7 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { } results = query.getResultList(); - - entityManager.flush(); - entityManager.clear(); - + tx.commit(); } @@ -129,4 +135,10 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { protected void doJumpToPage(int itemIndex) { } + @Override + protected void doClose() throws Exception { + entityManager.close(); + super.doClose(); + } + }