Adloun

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

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 →