Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 6 · Application directe du cours
Le côté propriétaire oublié
Relations et transactions · niveau 2
Énoncé
Un développeur ajoute une ligne à une commande en écrivant
commande.getLignes().add(ligne); // au lieu de commande.ajouterLigne(ligne)
puis enregistre la commande. Que se passe-t-il ? Pourquoi ? Écrire un test qui le montre.
Corrigé
La ligne est bien insérée (la cascade la voit dans la liste), mais sa clé étrangère est vide, puisque le champ commande de la ligne, côté propriétaire, n'a pas été renseigné ; la contrainte not null de la colonne la refuse :
could not execute statement [NULL non permis pour la colonne "COMMANDE_NUMERO"
NULL not allowed for column "COMMANDE_NUMERO"; SQL statement:
insert into ligne_commande (commande_numero,livre_isbn,prix_unitaire,quantite,id) values (?,?,?,?,default) [23502-240]]
Spring traduit l'erreur en DataIntegrityViolationException (le message de H2 est en français, puis en anglais). Le test :
void ex3_cotePropietaireOublie() {
assertThatThrownBy(() -> transaction.executeWithoutResult(t -> {
Commande c = new Commande("Client", "c@x.fr", Retrait.BOUTIQUE);
Livre livre = livres.findById(JAVA).orElseThrow();
c.getLignes().add(new LigneCommande(livre, 1)); // sans ajouterLigne()
commandes.save(c);
})).isInstanceOf(DataIntegrityViolationException.class)
.satisfies(e -> System.out.println("ex3 : " + e.getMessage()));
}
Sans la contrainte not null, ce serait pire : la ligne serait enregistrée, orpheline, sans aucune erreur. C'est pourquoi LigneCommande n'expose pas de moyen de rattacher une ligne autrement que par Commande.ajouterLigne.
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.