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.
La siguiente interfaz en el sistema de herencia es PagingAndSortingRepository (docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html), esta interfaz actua de forma similar a CrudRepository pero proporciona versiones de los métodos CRUD capaces de manejar paginación y ordenamiento. Al igual que en el caso de CrudRepository, un repositorio Spring Data JPA solo necesita extender la interfaz para que el framework provea toda la interfaz.
Las siguientes clases e interfaces en el sistema de herencia ya no hace parte de el framework Spring, y por tanto, es en este punto donde un repositorio SIMO se empieza a diferenciar de un repositorio Spring Data JPA.
La primera de ellas es SearchableRepository, esta interfaz define métodos orientados a proporcionar al repositorio capacidades de búsqueda. Se definen tres métodos pricipales, con sus respectivas versiones paginadas
- findByQuery: Encuentra entidades utilizando JPA (Criteria)
- search: Encuentra entidades utilizando Hibernate Search y Lucene
- find: Encuentra entidades con base en la propiedad search_mode del sistema (0 utiliza search, 1 utiliza preferiblemente search y si hay un error utiliza findByQuery, 2 utiliza findByQuery
La se