Ressource

1. Télécharger et lancer le projet

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

  • ClientDAO qui permet de manipuler nos entités, par exemple la méthode getAllClients() permets de récupérer tous les clients
  • ClientService qui 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.xml la 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