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
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.