Class RepositoryItemWriter<T>

java.lang.Object
org.springframework.batch.infrastructure.item.data.RepositoryItemWriter<T>
All Implemented Interfaces:
ItemWriter<T>, org.springframework.beans.factory.InitializingBean

public class RepositoryItemWriter<T> extends Object implements ItemWriter<T>, org.springframework.beans.factory.InitializingBean

A ItemWriter wrapper for a CrudRepository from Spring Data.

By default, this writer will use CrudRepository.saveAll(Iterable) to save items, unless another method is selected with setMethodName(java.lang.String). It depends on CrudRepository.saveAll(Iterable) method to store the items for the chunk. Performance will be determined by that implementation more than this writer.

As long as the repository provided is thread-safe, this writer is also thread-safe once properties are set (normal singleton behavior), so it can be used in multiple concurrent transactions.

NOTE: The RepositoryItemWriter only stores Java Objects i.e. non primitives.

If the underlying repository needs to be flushed after writing (for example JpaRepository), this can be achieved in one of two ways: if the repository exposes a single method that both saves and flushes items, such as JpaRepository#saveAllAndFlush(Iterable), that method name can be set with setMethodName(java.lang.String) and it will be invoked once with the whole chunk. Otherwise, if saving and flushing are separate operations, flush() can be overridden in a subclass to perform the flush after the chunk has been written.

Since:
2.2
Author:
Michael Minella, Mahmoud Ben Hassine
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected static final org.apache.commons.logging.Log
     
    protected org.springframework.data.repository.CrudRepository<T,?>
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    RepositoryItemWriter(org.springframework.data.repository.CrudRepository<T,?> repository)
    Create a new RepositoryItemWriter instance with the provided repository.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Check mandatory properties - there must be a repository.
    protected void
    doWrite(Chunk<? extends T> items)
    Performs the actual write to the repository.
    protected void
    Flush the repository if necessary.
    void
    setMethodName(String methodName)
    Specifies what method on the repository to call.
    void
    setRepository(org.springframework.data.repository.CrudRepository<T,?> repository)
    Deprecated, for removal: This API element is subject to removal in a future version.
    since 6.1 in favor of passing the repository to the constructor.
    void
    write(Chunk<? extends T> chunk)
    Write all items to the data store via a Spring Data repository.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • logger

      protected static final org.apache.commons.logging.Log logger
    • repository

      protected org.springframework.data.repository.CrudRepository<T,?> repository
  • Constructor Details

    • RepositoryItemWriter

      public RepositoryItemWriter(org.springframework.data.repository.CrudRepository<T,?> repository)
      Create a new RepositoryItemWriter instance with the provided repository.
      Parameters:
      repository - the Spring Data repository to be used for persistence.
      Since:
      6.0
  • Method Details

    • setMethodName

      public void setMethodName(String methodName)
      Specifies what method on the repository to call. This method must either accept the type of object passed to this writer as its sole argument, in which case it is invoked once per item, or accept an Iterable as its sole argument (for example saveAll or saveAllAndFlush), in which case it is invoked once with the whole chunk.
      Parameters:
      methodName - String containing the method name.
    • setRepository

      @Deprecated(since="6.1", forRemoval=true) public void setRepository(org.springframework.data.repository.CrudRepository<T,?> repository)
      Deprecated, for removal: This API element is subject to removal in a future version.
      since 6.1 in favor of passing the repository to the constructor. Scheduled for removal in 7.0.
      Set the CrudRepository implementation for persistence.
      Parameters:
      repository - the Spring Data repository to be set
    • write

      public void write(Chunk<? extends T> chunk) throws Exception
      Write all items to the data store via a Spring Data repository.
      Specified by:
      write in interface ItemWriter<T>
      Parameters:
      chunk - of items to be written. Never null but may be empty.
      Throws:
      Exception - if there are errors. The framework will catch the exception and convert or rethrow it as appropriate.
      See Also:
    • flush

      protected void flush()
      Flush the repository if necessary. This method is a no-op by default, but can be overridden by a subclass to flush the underlying repository when it exposes a separate flush operation, rather than a single method that both saves and flushes (such as JpaRepository#saveAllAndFlush, which can be used directly via setMethodName(String)).
      Since:
      6.1
    • doWrite

      protected void doWrite(Chunk<? extends T> items) throws Exception
      Performs the actual write to the repository. This can be overridden by a subclass if necessary.
      Parameters:
      items - the list of items to be persisted.
      Throws:
      Exception - thrown if error occurs during writing.
    • afterPropertiesSet

      public void afterPropertiesSet() throws Exception
      Check mandatory properties - there must be a repository.
      Specified by:
      afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
      Throws:
      Exception