java - rowmapper - ¿Cómo usar @Transactional con Spring Data?
spring jdbc ejemplo (3)
¿De qué se trata en realidad tu pregunta? El uso de la anotación @Transactional
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, usar esta anotación en una interfaz de repositorio de Spring Data no tiene ningún efecto.
@Transactional
: para el módulo JPA tenemos esta anotación sobre la clase de implementación que respalda el proxy ( SimpleJpaRepository
). Esto se debe a dos razones: primero, persistir y eliminar objetos requiere una transacción en JPA. Por lo tanto, debemos asegurarnos de que se está ejecutando una transacción, lo cual hacemos haciendo que el método se anote con @Transactional
.
Los métodos de lectura como findAll()
y findOne(…)
utilizan @Transactional(readOnly = true)
que no es estrictamente necesario pero desencadena algunas optimizaciones en la infraestructura de transacciones (configurando FlushMode
en MANUAL
para permitir que los proveedores de persistencia salten las comprobaciones sucias al cerrar EntityManager
). Más allá de eso, la bandera también se establece en la conexión JDBC, lo que causa más optimizaciones en ese nivel.
Dependiendo de la base de datos que use, puede omitir bloqueos de tablas o incluso rechazar operaciones de escritura que podría desencadenar accidentalmente. Por lo tanto, recomendamos utilizar @Transactional(readOnly = true)
para los métodos de consulta, lo cual puede lograr agregando fácilmente esa anotación a la interfaz del repositorio. Asegúrese de agregar un @Transactional
simple a los métodos de manipulación que podría haber declarado o redecorado en esa interfaz.
Empecé a trabajar en un proyecto de Spring-data, Hibernate, MySQL, JPA. Cambié a datos de primavera para no tener que preocuparme por crear consultas a mano.
@Transactional
que el uso de @Transactional
no es necesario cuando se utilizan datos de primavera ya que también intenté mis consultas sin la anotación.
¿Hay alguna razón específica por la que debería / no debería estar usando la anotación @Repository
?
Trabajos:
@Transactional
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
También funciona:
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
¡Gracias por adelantado!
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í: http://www.ibm.com/developerworks/java/library/j-ts1/index.html
Atentamente
Deberías usar la anotación @Repository
Esto se debe a que @Repository
se usa para traducir la excepción de SQL no verificada a Spring Excpetion y la única excepción que debe tratar es DataAccessException