Created
May 15, 2017 11:12
-
-
Save ghusta/abdd0864bd8a3bb398d241e20ac241bd to your computer and use it in GitHub Desktop.
Spring Batch (ItemReader) + Spring Data JPA (JpaRepository) integration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.util.concurrent.CopyOnWriteArrayList; | |
| import org.springframework.batch.item.ItemReader; | |
| import org.springframework.batch.item.database.AbstractPagingItemReader; | |
| import org.springframework.data.domain.Page; | |
| import org.springframework.data.domain.PageRequest; | |
| import org.springframework.data.domain.Pageable; | |
| import org.springframework.data.domain.Sort; | |
| import org.springframework.data.jpa.repository.JpaRepository; | |
| import org.springframework.transaction.annotation.Transactional; | |
| import org.springframework.util.Assert; | |
| /** | |
| * Permet d'utiliser un {@link JpaRepository} comme {@link ItemReader}, | |
| * en utilisant la pagination lors de l'exécution de la requête JPQL. | |
| * <p> | |
| * L'appel à {@link #doReadPage()} incrémente {@link #getPage()}. | |
| * <br/> | |
| * La lecture (read()) retourne un page (bloc de n éléments). | |
| * <br/> | |
| * Par défaut, {@link #getPageSize} = 10. | |
| * </p> | |
| * <p> | |
| * <i>JpaRepository extends PagingAndSortingRepository</i>, la pagination est donc supportée | |
| * grâce à la méthode <code>findAll()</code>. | |
| * </p> | |
| * | |
| * @see org.springframework.batch.item.database.JpaPagingItemReader | |
| * @see org.springframework.batch.item.data.RepositoryItemReader | |
| * | |
| * @param <T> Entity JPA. | |
| */ | |
| public class JpaRepositoryItemReader<T> | |
| extends AbstractPagingItemReader<T> | |
| { | |
| /** | |
| * Spring Data JPA : {@link JpaRepository}. | |
| */ | |
| private JpaRepository<T, ?> jpaRepository; | |
| /** | |
| * Spring Data : {@link Sort}. | |
| */ | |
| private Sort sort; | |
| /** | |
| * Par défaut {@link #getPageSize()} = 10. | |
| * | |
| * @param jpaRepository JpaRepository (Spring Data JPA). | |
| */ | |
| public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository) | |
| { | |
| Assert.notNull(jpaRepository, "JpaRepository doit etre non null"); | |
| this.jpaRepository = jpaRepository; | |
| } | |
| /** | |
| * | |
| * @param jpaRepository JpaRepository (Spring Data JPA). | |
| * @param pageSize Définit {@link #getPageSize()}. | |
| */ | |
| public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository, int pageSize) | |
| { | |
| this(jpaRepository); | |
| setPageSize(pageSize); | |
| } | |
| /** | |
| * | |
| * @param jpaRepository JpaRepository (Spring Data JPA). | |
| * @param pageSize Définit {@link #getPageSize()}. | |
| * @param sort Options de tri pour la requête : {@link Sort}. | |
| */ | |
| public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository, int pageSize, final Sort sort) | |
| { | |
| this(jpaRepository, pageSize); | |
| this.sort = sort; | |
| } | |
| @Override | |
| protected void doReadPage() | |
| { | |
| Pageable pageable; | |
| if (sort == null) | |
| { | |
| pageable = new PageRequest(getPage(), getPageSize()); | |
| } | |
| else | |
| { | |
| pageable = new PageRequest(getPage(), getPageSize(), sort); | |
| } | |
| Page<T> pageResults = jpaRepository.findAll(pageable); | |
| if (results == null) | |
| { | |
| results = new CopyOnWriteArrayList<T>(); | |
| } | |
| else | |
| { | |
| results.clear(); | |
| } | |
| if (!pageResults.getContent().isEmpty()) | |
| { | |
| results.addAll(pageResults.getContent()); | |
| } | |
| } | |
| @Override | |
| protected void doJumpToPage(int itemIndex) | |
| { | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.util.List; | |
| import org.springframework.batch.item.ItemReader; | |
| import org.springframework.batch.item.ItemWriter; | |
| import org.springframework.data.jpa.repository.JpaRepository; | |
| import org.springframework.transaction.annotation.Transactional; | |
| import org.springframework.util.Assert; | |
| /** | |
| * Permet d'utiliser un {@link JpaRepository} comme {@link ItemWriter}. | |
| * <p></p> | |
| * Integration Spring Batch / Spring Data JPA. | |
| * <br> | |
| * A tester (transaction, EntityManager...). | |
| * <br> | |
| * Peu de plus-value par rapport à {@code JpaItemWriter}, | |
| * si ce n'est d'éviter de manipuler directement {@code EntityManagerFactory}. | |
| * | |
| * @see JpaRepository | |
| * @see org.springframework.batch.item.database.JpaItemWriter | |
| * @see org.springframework.batch.item.data.RepositoryItemWriter | |
| * | |
| * @param <T> Entity JPA | |
| */ | |
| public class JpaRepositoryItemWriter<T> | |
| implements ItemWriter<T> | |
| { | |
| /** | |
| * Spring Data JPA : JpaRepository. | |
| */ | |
| private JpaRepository<T, ?> jpaRepository; | |
| public JpaRepositoryItemWriter(JpaRepository<T, ?> jpaRepository) | |
| { | |
| Assert.notNull(jpaRepository, "JpaRepository doit etre non null"); | |
| this.jpaRepository = jpaRepository; | |
| } | |
| @Override | |
| public void write(List<? extends T> items) throws Exception | |
| { | |
| for (T item : items) | |
| { | |
| jpaRepository.save(item); | |
| } | |
| jpaRepository.flush(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment