diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java
index fdcc2084f..8732d28ea 100644
--- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java
+++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateCursorItemReader.java
@@ -35,8 +35,10 @@ import org.springframework.util.ClassUtils;
* executes the HQL query when initialized iterates over the result set as
* {@link #read()} method is called, returning an object corresponding to
* current row. The query can be set directly using
- * {@link #setQueryString(String)} or a named query can be used by
- * {@link #setQueryName(String)}.
+ * {@link #setQueryString(String)}, a named query can be used by
+ * {@link #setQueryName(String)}, or a query provider strategy can be supplied
+ * via {@link #setQueryProvider(HibernateQueryProvider)}.
+ *
*
*
* The reader can be configured to use either {@link StatelessSession}
@@ -165,7 +167,7 @@ public class HibernateCursorItemReader extends AbstractItemCountingItemStream
cursor = helper.getForwardOnlyCursor();
initialized = true;
}
-
+
/**
* Update the context and clear the session if stateful.
*
diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java
index d7a3a38d9..bdf198e55 100644
--- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java
+++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java
@@ -26,16 +26,18 @@ import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.springframework.batch.item.database.support.AbstractHibernateQueryProvider;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
- * Internal shared state helper for hibernate readers.
+ * Internal shared state helper for hibernate readers managing sessions and
+ * queries.
*
* @author Dave Syer
*
*/
-class HibernateItemReaderHelper {
+class HibernateItemReaderHelper implements InitializingBean {
private SessionFactory sessionFactory;
@@ -170,7 +172,7 @@ class HibernateItemReaderHelper {
}
}
- // if queryProvider is set use it to create a query
+ // If queryProvider is set use it to create a query
return queryProvider.createQuery();
}
@@ -203,8 +205,11 @@ class HibernateItemReaderHelper {
}
/**
- * @param page the page to read
- * @param pageSize the size of the page
+ * Read a page of data, clearing the existing session (if necessary) first,
+ * and creating a new session before executing the query.
+ *
+ * @param page the page to read (starting at 0)
+ * @param pageSize the size of the page or maximum number of items to read
* @return a collection of items
*/
public Collection extends T> readPage(int page, int pageSize) {
@@ -225,7 +230,7 @@ class HibernateItemReaderHelper {
* Clear the session if stateful.
*/
public void clear() {
- if (statefulSession!=null) {
+ if (statefulSession != null) {
statefulSession.clear();
}
}
diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernatePagingItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernatePagingItemReader.java
index 9af26044e..27dab61e9 100644
--- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernatePagingItemReader.java
+++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernatePagingItemReader.java
@@ -28,12 +28,13 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.ClassUtils;
/**
- * {@link ItemReader} for reading database records built on top of Hibernate. It
- * executes the HQL query when initialized iterates over the result set as
- * {@link #read()} method is called, returning an object corresponding to
- * current row. The query can be set directly using
- * {@link #setQueryString(String)} or a named query can be used by
- * {@link #setQueryName(String)}.
+ * {@link ItemReader} for reading database records built on top of Hibernate and
+ * reading only up to a fixed number of items at a time. It executes an HQL
+ * query when initialized is paged as the {@link #read()} method is called. The
+ * query can be set directly using {@link #setQueryString(String)}, a named
+ * query can be used by {@link #setQueryName(String)}, or a query provider
+ * strategy can be supplied via
+ * {@link #setQueryProvider(HibernateQueryProvider)}.
*
*
* The reader can be configured to use either {@link StatelessSession}
@@ -63,11 +64,6 @@ public class HibernatePagingItemReader extends AbstractPagingItemReader im
setName(ClassUtils.getShortName(HibernatePagingItemReader.class));
}
- public void afterPropertiesSet() throws Exception {
- super.afterPropertiesSet();
- helper.afterPropertiesSet();
- }
-
/**
* The parameter values to apply to a query (map of name:value).
*
@@ -131,6 +127,11 @@ public class HibernatePagingItemReader extends AbstractPagingItemReader im
helper.setUseStatelessSession(useStatelessSession);
}
+ public void afterPropertiesSet() throws Exception {
+ super.afterPropertiesSet();
+ helper.afterPropertiesSet();
+ }
+
@Override
protected void doOpen() throws Exception {
super.doOpen();
@@ -145,7 +146,7 @@ public class HibernatePagingItemReader extends AbstractPagingItemReader im
else {
results.clear();
}
-
+
results.addAll(helper.readPage(getPage(), getPageSize()));
}