¿De qué se trata realmente tu pregunta? El uso de la @Repository
anotación o @Transactional
.
@Repository
no es necesario en absoluto, ya que la interfaz que declara estará respaldada por un proxy que la infraestructura de Spring Data crea y activa la traducción de excepciones de todos modos. Entonces, el uso de esta anotación en una interfaz de repositorio de Spring Data no tiene ningún efecto en absoluto.
@Transactional
- para el módulo JPA tenemos esta anotación en la clase de implementación que respalda el proxy ( SimpleJpaRepository
). Esto se debe a dos razones: primero, la persistencia y eliminación de objetos requiere una transacción en JPA. Por lo tanto, debemos asegurarnos de que se esté ejecutando una transacción, lo que hacemos al anotar el método con @Transactional
.
Los métodos de lectura como findAll()
y findOne(…)
están utilizando, @Transactional(readOnly = true)
que no son estrictamente necesarios, pero desencadenan algunas optimizaciones en la infraestructura de transacciones (configurar FlushMode
to MANUAL
para permitir que los proveedores de persistencia puedan omitir las comprobaciones sucias al cerrar EntityManager
). Más allá de eso, la bandera también se establece en la conexión JDBC, lo que provoca más optimizaciones en ese nivel.
Dependiendo de la base de datos que utilice, puede omitir bloqueos de tabla o incluso rechazar operaciones de escritura que podría activar accidentalmente. Por lo tanto, recomendamos usar también los @Transactional(readOnly = true)
métodos de consulta que puede lograr fácilmente agregando esa anotación a la interfaz de su repositorio. Asegúrese de agregar un simple @Transactional
a los métodos de manipulación que podría haber declarado o redecorado en esa interfaz.