¡Esta es una revisión vieja del documento!
Un repositorio SIMO proporciona los métodos de acceso a la capa de persistencia. En particular, los métodos de los repositorios proveen la lógica para manipular objetos de entidades JPA e interactuar con el sistema de almacenamiento subyacente mediante operaciones de tipo CRUD (Create, Retrieve, Update, Delete). Estas operaciones CRUD proporcionan un nivel de abstracción mayor, en el sentido de que no se requiere el acceso directo a las primitivas del API JPA.
Los repositorios SIMO se basan en los repositorios Spring Data JPA, si bien los repositorios Spring Data JPA proporcionan funcionalidad CRUD básica, SIMO ha extendido estas funcionalidades mediente el uso de herencia y tipos genéricos con el objeto de incluir operaciones adicionales, estas operaciones incluyen operaciones de búsqueda avanzada basadas en Hibernate Search y operaciones optimizadas para el despliegue de listas, entre otras. En el siguiente diagrama se muestra la estructura de herencia de un repositorio SIMO que a su vez sirve para ilustrar el camino de evolución desde un repositorio Spring Data JPA hasta un repositorio SIMO.
En su versión más sencilla, un repositorio Spring Data JPA es una interfaz que extiende de CrudRepository, al hacerlo, el framework Spring produce una implementación por defecto que incluye los métodos básicos de docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html CrudRepository, y que básicamente son los métodos CRUD tradicionales. Nótese que el repositorio recibe un parámetro de tipo que es la entidad JPA que maneja el repositorio, es decir que los métodos CRUD quedan parametrizados para manejar una entidad en particular.
Otra característica muy importante de los repositorios Spring Data JPA, es la capacidad de crear métodos finder o incluso métodos delete, update e insert, sin necesidad de escribir su implementación. Símplemente al escribir la declaración del método, el framework es capaz de construir la lógica a partir del nombre del método, bajo unas convenviones establecidas o a través de sentencias JPQL especificadas mediante la anotación @Query.