Ressource
1. Télécharger et lancer le projet
- Lancer Docker Desktop
- Télécharger et importer le projet Maven dans Eclipse
Lancer l’image docker présente dans le Dockerfile : docker compose up
2. Présentation
Objectif
Comprendre le fetching et commencer à créer une architecture en couche
Un clients :
- peut avoir effectué plusieurs commandes
- peut avoir ajouté des articles en favoris
Nous avons donc représenter l’entité Client suivante
@Entity
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nom;
private String email;
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.LAZY) // Ne charge pas automatiquement les commandes
private List<Commande> commandes = new ArrayList<>();
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.LAZY) // Ne charge pas automatiquement les favoris
private List<Article> favoris = new ArrayList<>();
}En plus des entités, nous avons deux classes supplémentaires
ClientDAOqui permet de manipuler nos entités, par exemple la méthodegetAllClients()permets de récupérer tous les clientsClientServicequi représente la couche service, elle permet d’ajouter de la logique métier
3. Consignes
Nous simulons la construction d’une API pour un siteweb
- premièrement nous souhaitons avoir un tableau (HTML) avec la liste des clients avec deux colonne leur email et leur nom
- ensuite, nous pouvons cliquer sur un des client pour afficher la fiche client qui contient plus d’information
- email + nom du client
- et également l’ensemble de ses commandes et de ses favoris
a) Compléter getAllClient()
Nous souhaitons afficher la liste des clients (email + nom)
- compléter la méthode
ClientService#getAllClients()
On lancera le code depuis la méthode main()
— M’appeler
b) Compléter getFicheClient(int)
De la même manière que getAllClient() compléter getFicheClient(int) pour afficher les informations suivantes
- email et nom du client
- la liste des commandes du clients ainsi que ses favoris
Que constatez-vous ?
Quelle est la façon la plus “simple” pour corriger ce problème ? est-ce une bonne solution ?
— M’appeler
c) Réfléchir à des solutions
— M’appeler
Implémenter plusieurs solutions
Ci-dessous plusieurs solutions pour répondre au problème
1. Propriété enable_lazy_load_no_trans
Ressource
- On peut ajouter dans le fichier
persistance.xmlla propriété ci-dessous qui permet de bypass tous les problèmes liés au lazy. - Combien de requête sont exécutées ?
<property name="hibernate.enable_lazy_load_no_trans" value="true" />Supprimer la propriété pour les prochaines questions
2. Hibernate.initialize()
- Combien de requête sont exécutées ?
3. JOIN FETCH
Faire des jointures SQL en utilisant createQuery() et JPQL
- Combien de requête sont exécutées ?
4.Entity Graph
Section 4. Named Entity Graph de l’article https://thorben-janssen.com/5-ways-to-initialize-lazy-relations-and-when-to-use-them/
- Combien de requête sont exécutés ?
4. Compléments
Pour les étudiants en avance, vous pouvez coder les méthodes suivante :
saveClient(Client client)saveOrUpdateClient(Client client)(merge)addCommandeToClient(int clientId, Commande commande)- On peut se poser la question si cette méthode va dans la couche service ou DAO