Aller au contenu

7 - @OneToOne : ASSOCIATION BIDIRECTIONNELLE DE 1 VERS 1 (client03)

TRAVAIL A REALISER :

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;

Mise en place de l’association bidirectionnelle de un vers un

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;

Code du controleur

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

tp7-bi-1-1.png

Retour vers les autres exercices