Adloun

Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 5 · Application directe du cours

Combien d'update ?

Les données en base avec JPA et Spring Data · niveau 2

Énoncé

Dans une méthode @Transactional, on charge un livre, on change son prix pour 99,00, puis on lui rend son ancien prix. Dans une seconde méthode, on change le prix deux fois de suite (30,00 puis 29,00). Combien de requêtes update chacune envoie-t-elle ? Proposer un moyen de le vérifier par un test.

Corrigé


    @Transactional
    public void allerRetour(String isbn) {
        Livre livre = depot.findById(isbn).orElseThrow();
        BigDecimal ancien = livre.getPrix();
        livre.setPrix(new BigDecimal("99.00"));
        livre.setPrix(ancien);                  // retour à la valeur de départ
    }

    @Transactional
    public void deuxFois(String isbn) {
        Livre livre = depot.findById(isbn).orElseThrow();
        livre.setPrix(new BigDecimal("30.00"));
        livre.setPrix(new BigDecimal("29.00"));
    }
}

La première méthode n'envoie aucun update : à la fin de la transaction, Hibernate compare l'état de l'entité à la copie prise au chargement, et ils sont égaux. La seconde en envoie un seul, avec le prix final 29,00 : les états intermédiaires ne sont jamais écrits.

Pour le vérifier, on active les statistiques d'Hibernate dans un test et on compte les mises à jour d'entités :


@SpringBootTest(properties = "spring.jpa.properties.hibernate.generate_statistics=true")
class TarifsTest {

    @Autowired
    Tarifs tarifs;

    @Autowired
    EntityManagerFactory emf;

    Statistics stats;

    @BeforeEach
    void raz() {
        stats = emf.unwrap(SessionFactory.class).getStatistics();
        stats.clear();
    }

    @Test
    void allerRetourNEnvoieAucunUpdate() {
        tarifs.allerRetour("9782956300014");
        assertThat(stats.getEntityUpdateCount()).isZero();
    }

    @Test
    void deuxModificationsUnSeulUpdate() {
        tarifs.deuxFois("9782956300038");
        assertThat(stats.getEntityUpdateCount()).isEqualTo(1);
    }
}

Les deux tests passent.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →