From 5706813b027fb34e50c8555884705fa55fcf46e4 Mon Sep 17 00:00:00 2001 From: willschipp Date: Thu, 28 Feb 2013 21:01:24 -0500 Subject: [PATCH] addition of transacted value to JpaPagingItemReader --- .../item/database/JpaPagingItemReader.java | 44 +++++++++++++++---- ...tDataSourceItemReaderIntegrationTests.java | 10 +++++ 2 files changed, 46 insertions(+), 8 deletions(-) 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 fd8c002fd..9500384fa 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 @@ -17,6 +17,7 @@ package org.springframework.batch.item.database; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; @@ -79,6 +80,7 @@ import org.springframework.util.ClassUtils; * * @author Thomas Risberg * @author Dave Syer + * @author Will Schipp * @since 2.0 */ public class JpaPagingItemReader extends AbstractPagingItemReader { @@ -94,6 +96,8 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { private JpaQueryProvider queryProvider; private Map parameterValues; + + private boolean transacted = true;//default value public JpaPagingItemReader() { setName(ClassUtils.getShortName(JpaPagingItemReader.class)); @@ -125,6 +129,18 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { public void setParameterValues(Map parameterValues) { this.parameterValues = parameterValues; } + + /** + * By default (true) the EntityTransaction will be started and committed around the read. + * Can be overridden (false) in cases where the JPA implementation doesn't support a + * particular transaction. (e.g. Hibernate with a JTA transaction). NOTE: may cause + * problems in guaranteeing the object consistency in the EntityManagerFactory. + * + * @param transacted + */ + public void setTransacted(boolean transacted) { + this.transacted = transacted; + } @Override public void afterPropertiesSet() throws Exception { @@ -174,11 +190,15 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { @SuppressWarnings("unchecked") protected void doReadPage() { - EntityTransaction tx = entityManager.getTransaction(); - tx.begin(); - - entityManager.flush(); - entityManager.clear(); + EntityTransaction tx = null; + + if (transacted) { + tx = entityManager.getTransaction(); + tx.begin(); + + entityManager.flush(); + entityManager.clear(); + }//end if Query query = createQuery().setFirstResult(getPage() * getPageSize()).setMaxResults(getPageSize()); @@ -194,9 +214,17 @@ public class JpaPagingItemReader extends AbstractPagingItemReader { else { results.clear(); } - results.addAll(query.getResultList()); - - tx.commit(); + + if (!transacted) { + List queryResult = query.getResultList(); + for (T entity : queryResult) { + entityManager.detach(entity); + results.add(entity); + }//end if + } else { + results.addAll(query.getResultList()); + tx.commit(); + }//end if } @Override diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java index e3f0c87ed..e792e6778 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java @@ -254,6 +254,16 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests { assertEquals(4, foo4.getValue()); assertEquals(5, foo5.getValue()); } + + + //set transaction to false and make sure the tests work + @Test + public void testTransacted() throws Exception { + if (reader instanceof JpaPagingItemReader) { + ((JpaPagingItemReader)reader).setTransacted(false); + this.testNormalProcessing(); + }//end if + } protected ItemStream getAsItemStream(ItemReader source) { return (ItemStream) source;