Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

360
Views
Spring Data JPA + Hibernate Métodos de marcado como transaccional

Estoy usando el repositorio de Spring data JPA para mi aplicación. Actualmente estoy usando operaciones CRUD básicas proporcionadas de forma predeterminada por los repositorios jpa de datos de primavera y para consultas de combinación complejas, estoy escribiendo consultas JPQL personalizadas de la siguiente manera:

 public interface ContinentRepository extends JpaRepository<Continent, Long> { @Query(value = "SELECT u FROM Continent u JOIN FETCH ... WHERE u.id = ?1") public List<Continent> findContinent(Long id); }

En mi clase de servicio, estoy autoconectando este repositorio y realizando operaciones de base de datos.

 @Service public class MyService { @Autowired public ContinentRepository cr; public void read() { var result1 = cr.findContinent(1); var result2 = cr.findContinent(2); } @Transactional public void write() { var c = new Continent(); // setters c = cr.save(c); } }

Actualmente solo estoy marcando write() como org.springframework.transaction.annotation.Transactional .

  1. ¿Debería marcar también el método read() con Transactional(readOnly = true) ? Como solo realiza operaciones de lectura.
  2. ¿Debería marcar también findContinent(Long id) como Transactional(readOnly = true)? Leí que todos los métodos predeterminados están marcados como Transaccional https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
  3. En la interfaz del repositorio, ¿debería marcar la anotación transaccional en el nivel de método o en el nivel de interfaz? (Además, sospecho que la mayoría de los métodos personalizados serán de solo lectura)
  4. ¿Es bueno tener @Transactional tanto en la capa de Servicio como en la de Repositorio?
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

  1. ¿Debería marcar también el método read() con Transactional(readOnly = true)? Como solo realiza operaciones de lectura.

No es realmente necesario, sin embargo, podría crear algunas optimizaciones con respecto al consumo de memoria caché de acuerdo con este blog https://vladmihalcea.com/spring-read-only-transaction-hibernate-optimization/

  1. ¿Debería marcar también findContinent(Long id) como Transactional(readOnly = true)? Leí que todos los métodos predeterminados están marcados como Transaccional https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

La misma respuesta que en el primer caso.

  1. En la interfaz del repositorio, ¿debería marcar la anotación transaccional en el nivel de método o en el nivel de interfaz? (Además, sospecho que la mayoría de los métodos personalizados serán de solo lectura)

En general, agregué al nivel del método, porque tengo más control sobre los parámetros como la reversión.

  1. ¿Es bueno tener @Transactional tanto en la capa de Servicio como en la de Repositorio?

Te recomiendo que tengas en el nivel de Servicio porque, allí, puedes actualizar muchas tablas (para que puedas usar muchos repositorios), y quieres que toda tu actualización sea transaccional.

over 4 years ago · Santiago Trujillo Report

0

  1. ¿Debería marcar también el método read() con Transactional(readOnly = true)? Como solo realiza operaciones de lectura.

Sí. Es una buena práctica, sabrá de inmediato que este método no cambia nada en la base de datos y, lo que es más importante, deshabilitará algunos cambios no intencionales en la base de datos utilizando este método de servicio. Si este método intenta realizar alguna actualización en la base de datos, se lanzará una excepción y se llamará a la reversión.

  1. ¿Debería marcar también findContinent(Long id) como Transactional(readOnly = true)? Leí que todos los métodos predeterminados están marcados como Transaccional https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

Depende de cómo lo estés usando. Si siempre está llamando a esto desde @Sevice, entonces no. Creo que es un caso de uso común hasta donde yo sé.

  1. En la interfaz del repositorio, ¿debería marcar la anotación transaccional en el nivel de método o en el nivel de interfaz? (Además, sospecho que la mayoría de los métodos personalizados serán de solo lectura)

Igual que 2.

  1. ¿Es bueno tener @Transactional tanto en la capa de Servicio como en la de Repositorio?

Igual que 2.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!