Réponds à voix haute ou par écrit avant d’ouvrir la réponse : c’est l’effort de rappel qui fait retenir. Marque ensuite la question « Je savais » ou « À revoir », puis filtre sur « À revoir » pour la prochaine séance. Les marques restent dans ce navigateur.

Rappel actif

Restitue de mémoire, sans support.

  1. Sans regarder : empile la stack de persistance de l’application jusqu’à la base, et donne pour chaque couche la classe ou l’interface qui la représente.

  2. Donne les phases du cycle de vie Maven avec leur commande, et pour chacune ce qu’elle produit ou modifie sur le disque.

  3. Cite les quatre starters du projet AutoLoc et ce que le projet perdrait si on retirait chacun d’eux.

  4. Cite les annotations JPA vues en cours et classe-les : obligatoires pour qu’une entité existe, ou optionnelles. Que fait chacune des optionnelles si on l’omet ?

Distingue

Deux notions proches : dis ce qui les sépare vraiment.

  1. JPA et Hibernate : un camarade dit « c’est la même chose ». Corrige-le en une phrase, puis donne l’interface qui représente chacun.

  2. Hibernate génère déjà le SQL du CRUD. Qu’apporte Spring Data JPA en plus, et sur quoi repose-t-il ?

  3. Repository local, distant, interne : où se trouve chacun, dans quel ordre Maven les consulte, et pourquoi une entreprise voudrait le troisième ?

  4. IDENTITY, AUTO, SEQUENCE, TABLE : qui produit l’identifiant dans chaque cas ?

  5. Mode standalone et mode plugin de Maven : où sert chacun ?

Explique pourquoi

Le mécanisme derrière la règle.

  1. Quel problème l’ORM résout-il ? Explique-le avec les deux modèles en jeu, puis cite trois limites de JDBC qui justifient de ne pas tout écrire à la main.

  2. Avec Spring Boot, on ajoute un starter sans jamais préciser la version de ses dizaines de dépendances, et pourtant tout est compatible. Pourquoi ?

  3. Que veut dire « convention over configuration » pour Maven, et en quoi est-ce un avantage face à Gradle ou Ant ?

  4. Pourquoi le cours lie-t-il Maven à l’intégration continue (DevOps) ?

  5. Pourquoi annoter un attribut Enum avec @Enumerated(EnumType.STRING) plutôt que laisser le comportement par défaut ?

Cas pratique

Choisis et justifie avec les critères du cours.

  1. Ton entreprise interdit aux serveurs de build d’accéder à Internet, donc à Maven Central. Comment le projet obtient-il ses dépendances ?

  2. Le client veut déployer AutoLoc sur un Tomcat déjà installé dans son SI, pas en lançant un jar. Spring Boot le permet-il ? Que change-t-on ?

  3. On veut passer AutoLoc de MySQL à PostgreSQL. Quels éléments du projet changent, et pourquoi les entités Livreur et Paiement ne changent-elles pas ?

  4. Tu lances l’application, aucune erreur, mais la table paiement n’apparaît pas dans autoloc_db. Liste trois choses à vérifier, dans l’ordre où tu le ferais.

Trouve l'erreur

Chaque affirmation contient au moins une faute.

  1. « Hibernate est la spécification Jakarta EE de la persistance, et JPA est son implémentation la plus connue. »

  2. « Pour repartir de zéro, je lance mvn clean : il vide ~/.m2 et force le retéléchargement des dépendances. »

  3. « Depuis qu’on utilise Spring Data JPA, on a retiré Hibernate du projet, il ne sert plus. »

  4. Trouve ce qui empêche cette classe d’être une entité valide :

    @Entity
    @Table(name = "paiement")
    public class Paiement {
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long idPaiement;
        private Double montant;
        private ModePaiement mode;
    }
    
  5. « Lombok est le module ORM de Spring : il génère les getters, setters et les tables de la base. »

  6. « J’ai mis LivreurServiceTest.java dans /src/main/java, à côté du service qu’il teste, c’est plus pratique. »

Lis le code

Relie le code aux concepts.

  1. À partir de cette entité, décris la table créée : son nom, ses colonnes, la façon dont la clé est produite, et ce qui est stocké dans statut.

    @Entity
    @Table(name = "livreur")
    @Getter @Setter @NoArgsConstructor @AllArgsConstructor
    public class Livreur {
        @Id
        @GeneratedValue(strategy = IDENTITY)
        private Long idLivreur;
        private String nom;
        private String prenom;
        private String telephone;
        @Enumerated(EnumType.STRING)
        private StatutLivreur statut;
    }
    
  2. Dans ce code, où se trouve le SQL ? Quel rôle joue @AllArgsConstructor sur le service ? À quelle couche appartient chaque type ?

    public interface ProjetDetailRepository extends JpaRepository<ProjetDetail, Long> { }
    
    @Service
    @AllArgsConstructor
    public class ProjetDetailService {
        private ProjetDetailRepository projetDetailRepository;
        public void addEtudiant(ProjetDetail projetDetail) {
            projetDetailRepository.save(projetDetail);
        }
    }
    
  3. Explique l’effet de chacune de ces lignes au démarrage de l’application.

    spring.datasource.url=jdbc:mysql://localhost:3306/ProjetSpring?createDatabaseIfNotExist=true
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=update
    

Vrai ou faux, justifie

La justification compte plus que le verdict.

  1. « Pour faire tourner une application Spring Boot, il faut d’abord installer un serveur Tomcat sur la machine. »

  2. « Maven télécharge les dépendances depuis Maven Central à chaque build. »

  3. « Avec un ORM, on n’a plus de connexion, de CRUD ni de déconnexion à faire. »

  4. « Spring Data est lié aux bases relationnelles. »

Classe

Range chaque élément et explique les cas limites.

  1. Range chaque fichier à sa place dans l’arborescence Maven : Livreur.java, LivreurServiceTest.java, application.properties, logo.png, autoloc-0.0.1.jar (généré), le fichier de config utilisé seulement par les tests.

  2. Range chaque élément : spécification, implémentation ORM, abstraction Spring, ou API bas niveau. JPA, Hibernate, EclipseLink, Spring Data JPA, JDBC, EntityManager, Session, PreparedStatement, JpaRepository.

Et si...

Prévois la conséquence.

  1. Et si tu lances directement mvn install alors qu’un test unitaire échoue ? Qu’est-ce qui arrive dans ~/.m2 ?

  2. Et si on ajoute un attribut email à l’entité Livreur et qu’on relance l’application avec ddl-auto=update ?

  3. Et si on supprime @GeneratedValue de idLivreur mais qu’on garde @Id ?