Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

354
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda