TRAVAIL A REALISER :
mettre en place une association bidirectionnelle de @OneToOne entre Client et Adresse. Cela signifie que l’on pourra accéder à l’Adresse depuis Client et au Client depuis l’Adresse. Il y aura donc un attribut de chaque type dans chacune des entités.
La classe entité Adresse comportera un attribut supplémentaire : client de type Client.
private int id; private String voie; private String complement; private String codePostal; private String ville; private String pays; private Client client;
La navigabilité de l’association est de Client vers Adresse et de Adresse vers Client.
L’annotation @OneToOne sur la méthode getAdresse() de Client indique la navigabilité de Client vers Adresse.
On précise juste le nom de la colonne de jointure ADDRESS_ID pour que ce soit plus explicite du côté base de données.
@OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name="ADDRESS_ID") public Adresse getAdresse() { return adresse; }
L’annotation @OneToOne sur la méthode getClient() de Adresse indique la navigabilité de Adresse vers Client.
La propriété « mappedBy » indique que le propriétaire ou le maître de la relation est déterminée du côté Client. L’attribut qui est associé à la propriété mappedBy est ici le nom de l’attribut de type Adresse, soit « adresse » en minuscule qui se trouve dans Client.
@OneToOne(mappedBy="adresse") public Client getClient() { return client; }
voici une annotation complémentaire avec le Jsonignore pour éviter une boucle infinie car le client a un attribut adresse qui elle-même a un attribut client, donc en json, ça boucle lors de la récupération.
@OneToOne(mappedBy = "adresse") // lié à l'attribut adresse dans Client @JsonIgnore // pour éviter une boucle infinie car le client a aussi un attribut adresse. private Client client;
il est forcément différent du précédent TP, il y a toujours des modifications à effectuer lorsque l’on change le mapping et donc les relations.
package fr.bouget.pinard.controleur; import java.util.Collection; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import fr.bouget.pinard.model.Adresse; import fr.bouget.pinard.model.Client; import fr.bouget.pinard.repository.ClientRepository; /** * @author Philippe * */ @CrossOrigin("*") @RestController public class ClientController { @Autowired private ClientRepository clientRepository; @GetMapping("/") @ResponseBody public String home() { Client client1=new Client("MARTIN","Jean"); clientRepository.saveAndFlush(client1); Adresse adresse1=new Adresse("5, rue du Renard","","75015","PARIS","FRANCE"); Client client2=new Client("DUPONT","sophie",adresse1); clientRepository.saveAndFlush(client2); Client client3=new Client("DURAND","Pierre",new Adresse("20, boulevard Gambetta","","78300","POISSY","FRANCE")); client3=clientRepository.saveAndFlush(client3); Client client4=new Client("MADEC","Denis",new Adresse("29, boulevard Devaux","","78300","POISSY","FRANCE")); client4=clientRepository.saveAndFlush(client4); System.out.println("Liste de tous les clients:"); this.affiche(clientRepository.findAll()); System.out.println("DURAND Pierre change d'adresse"); Adresse newAdresse = new Adresse("6 place de l'église","","35740","PACE","FRANCE"); client3.setAdresse(newAdresse); clientRepository.saveAndFlush(client3); System.out.println("MADEC Denis se désinscrit"); clientRepository.delete(client4); System.out.println("Liste de tous les clients:"); this.affiche(clientRepository.findAll()); StringBuilder sb = new StringBuilder(); sb.append("<h1>Regardez dans votre console et dans votre base de données MySQL <strong>JPA</strong></h1>"); sb.append("<a href='http://localhost:8080/clients'>Voir la liste des clients enregistrés</a>"); return sb.toString(); } @GetMapping(value = "/clients") public ResponseEntity<?> getAll(){ List<Client> liste = null; try { liste = clientRepository.findAll(); } catch (Exception e) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); } return ResponseEntity.status(HttpStatus.OK).body(liste); } /** * Méthode pour affichage dans la console * @param liste */ private void affiche(Collection<Client> liste) { for (Client client : liste) { System.out.println(client); } } }
Voici ce que vous devez écrire pour lancer votre controleur depuis votre navigateur :
http://localhost:8080/
puis testez : http://localhost:8080/clients
Résultat que vous devez obtenir après déploiement
Retour vers les autres exercices