Vous travaillez pour La Maison du Cacao Royal, une chocolaterie française de très grande renommée située à Mer.
À l’approche de Pâques, l’entreprise souhaite disposer d’une application Java en console pour gérer :
L’interface graphique n’est pas demandée. Un menu console sera fourni pour faciliter les tests.
L’objectif du projet est de mettre en pratique plusieurs notions vues en cours :
Votre projet devra obligatoirement mettre en œuvre les points suivants :
lire et exploiter les diagrammes fournis :
utiliser 2 design patterns obligatoires :
L’utilisation de Maven est fortement conseillée.
L’application devra permettre au minimum de :
Le diagramme suivant décrit les principales actions attendues dans le système.
Le diagramme de classes suivant vous aide à identifier les principales classes métier et techniques.
Le projet s’appuie sur 5 tables.
Une organisation possible est la suivante :
src/main/java/ └─ fr/chocolaterie/ ├─ config/ │ └─ DatabaseConnection.java ├─ model/ │ ├─ Categorie.java │ ├─ Produit.java │ ├─ Client.java │ ├─ Commande.java │ └─ LigneCommande.java ├─ dao/ │ ├─ ProduitDAO.java │ ├─ ClientDAO.java │ └─ CommandeDAO.java ├─ dao/impl/ │ ├─ ProduitDAOImpl.java │ ├─ ClientDAOImpl.java │ └─ CommandeDAOImpl.java ├─ exception/ │ └─ DataAccessException.java └─ service/ └─ ConsoleMenuService.java
Vous devez utiliser le pattern Singleton pour la gestion de la connexion à la base de données.
Exemple attendu :
DatabaseConnection
getInstance()
Vous devez utiliser le pattern DAO pour l’accès aux données.
ProduitDAO
ProduitDAOImpl
Un CRUD complet doit être réalisé sur au moins l’entité Produit :
Produit
Vous pouvez également faire un CRUD complet sur Client si vous souhaitez aller plus loin.
Client
private
SQLException
Vous pouvez utiliser PostgreSQL avec les scripts suivants.
DROP TABLE IF EXISTS ligne_commande; DROP TABLE IF EXISTS commande; DROP TABLE IF EXISTS produit; DROP TABLE IF EXISTS client; DROP TABLE IF EXISTS categorie; CREATE TABLE categorie ( id SERIAL PRIMARY KEY, libelle VARCHAR(100) NOT NULL UNIQUE ); CREATE TABLE produit ( id SERIAL PRIMARY KEY, nom VARCHAR(150) NOT NULL, description VARCHAR(255), prix NUMERIC(10,2) NOT NULL, stock INTEGER NOT NULL, categorie_id INTEGER NOT NULL, CONSTRAINT fk_produit_categorie FOREIGN KEY (categorie_id) REFERENCES categorie(id) ); CREATE TABLE client ( id SERIAL PRIMARY KEY, nom VARCHAR(100) NOT NULL, prenom VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL UNIQUE, telephone VARCHAR(30) ); CREATE TABLE commande ( id SERIAL PRIMARY KEY, date_commande DATE NOT NULL, statut VARCHAR(50) NOT NULL, montant_total NUMERIC(10,2) NOT NULL, client_id INTEGER NOT NULL, CONSTRAINT fk_commande_client FOREIGN KEY (client_id) REFERENCES client(id) ); CREATE TABLE ligne_commande ( quantite INTEGER NOT NULL, prix_unitaire NUMERIC(10,2) NOT NULL, produit_id INTEGER NOT NULL, commande_id INTEGER NOT NULL, PRIMARY KEY (produit_id, commande_id), CONSTRAINT fk_ligne_produit FOREIGN KEY (produit_id) REFERENCES produit(id), CONSTRAINT fk_ligne_commande FOREIGN KEY (commande_id) REFERENCES commande(id) );
INSERT INTO categorie (libelle) VALUES ('Oeufs de Pâques'), ('Lapins en chocolat'), ('Fritures'), ('Coffrets prestige'); INSERT INTO produit (nom, description, prix, stock, categorie_id) VALUES ('Œuf praliné signature', 'Grand œuf noir garni de praliné noisette', 29.90, 25, 1), ('Lapin lait croustillant', 'Lapin en chocolat au lait avec éclats caramélisés', 18.50, 40, 2), ('Friture royale assortie', 'Assortiment de petits chocolats de Pâques', 12.90, 60, 3), ('Coffret impérial de Pâques', 'Sélection prestige de la maison', 49.00, 15, 4), ('Œuf noir intense 72%', 'Œuf en chocolat noir grand cru', 31.50, 20, 1); INSERT INTO client (nom, prenom, email, telephone) VALUES ('Martin', 'Claire', 'claire.martin@example.com', '0601020304'), ('Dupont', 'Hugo', 'hugo.dupont@example.com', '0611223344'), ('Petit', 'Sarah', 'sarah.petit@example.com', '0677889900'); INSERT INTO commande (date_commande, statut, montant_total, client_id) VALUES ('2026-03-20', 'EN_PREPARATION', 42.80, 1), ('2026-03-22', 'VALIDEE', 49.00, 2); -- le produit_id et commande_id constitue la clef primaire composite. INSERT INTO ligne_commande (quantite, prix_unitaire, produit_id, commande_id) VALUES (1, 29.90, 1, 1), (1, 12.90, 3, 1), (1, 49.00, 4, 2);
À partir des diagrammes fournis :
Vous devez rendre :
À la fin du mini-projet, l’utilisateur doit pouvoir lancer l’application en console et effectuer des opérations comme :
Le tout dans une architecture propre, orientée objet et connectée à une base relationnelle (PostGreSQL)