¿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.
@Transactional(readOnly = true)
en la interfaz (ya que generalmente contiene principalmente métodos de búsqueda) y anular esta configuración para cada método de consulta de modificación con un archivo@Transactional
. De hecho, esa es la forma en que se haceSimpleJpaRepositoy
.Creo que la pregunta es un poco más amplia y no se puede reducir en las anotaciones en la capa de acceso a datos. Necesitamos considerar la pila completa de la aplicación, las estrategias de transacción que queremos aplicar, etc. Hay un conjunto muy completo de artículos sobre este tema de Mark Richards en el sitio de IBM developerworks. Puede encontrar el primero aquí: https://developer.ibm.com/articles/j-ts1/
Atentamente
fuente
Deberías usar la
@Repository
anotaciónEsto se debe a que
@Repository
se utiliza para traducir su excepción de SQL sin marcar a Spring Excpetion y la única excepción que debe tratar esDataAccessException
fuente
También usamos la anotación @Transactional para bloquear el registro para que otro hilo / solicitud no cambie la lectura.
fuente