J'utilise le référentiel de Spring data JPA pour mon application. Actuellement, j'utilise les opérations CRUD de base fournies par défaut par les référentiels Spring Data JPA et pour les requêtes de jointure complexes, j'écris des requêtes JPQL personnalisées comme suit :
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);
}
Dans ma classe de service, je suis en train de câbler ce référentiel et d'effectuer des opérations sur la base de données.
@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);
}
}
Actuellement, je ne fais que marquer le write()
como org.springframework.transaction.annotation.Transactional
.
- Dois-je également marquer
read()
méthode avecTransactional(readOnly = true)
? Comme il n'effectue que des opérations de lecture. - Dois-je également marquer le
findContinent(Long id)
comme Transactional(readOnly = true) ? J'ai lu que toutes les méthodes par défaut sont marquées comme transactionnelles. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions - Dans l'interface du référentiel, dois-je marquer l'annotation Transactional au niveau de la méthode ou au niveau de l'interface. (De plus, je pense que la plupart des méthodes personnalisées seront en lecture seule).
- Est-il bon d'avoir @Transactional à la fois dans la couche Service et dans la couche Référentiel ?