Aller au contenu

9 - @ManyToOne : ASSOCIATION UNIDIRECTIONNELLE DE N VERS 1 (croisiere01)

TRAVAIL A REALISER :

Une croisère a forcément un Paquebot et un Paquebot peut être associé à plusieurs Croisières.

La classe Paquebot comportera les attributs suivants :

    private int id;
    private String nom;
    private double tonnage;

La clé primaire id sera autogénérée.

La classe Croisiere comportera les attributs suivants :

    private int id;
    private String nom;
    private int duree;
    private Paquebot paquebot;

La clé primaire id sera autogénérée.

Mise en place de l’association unidirectionnelle de plusieurs vers un

La navigabilité de l’association est de Croisiere vers Paquebot.

L’annotation @ManyToOne sur la méthode getPaquebot() de Croisiere indique la navigabilité de Croisiere vers Paquebot.

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="PAQUEBOT_ID")
    public Paquebot getPaquebot() {
        return paquebot;
    }

L’absence d’attribut croisiere dans la classe Paquebot indique le caractère unidirectionnel de l’association.

La présence de l’annotation fetch=FetchType.EAGER dans le @ManyToOne permet de faire en sorte que l’objet Paquebot puisse être disponible depuis croisière dès l’instanciation. Cette propriété est davantage utilisée pour les Collections.

Voici le code à insérer dans votre contrôleur pour remplir la base de données et générer les tables dans MySQL :

@RestController
@CrossOrigin("*")
public class CroisiereController {

	@Autowired
	private CroisiereRepository croisiereRepo;

	@Autowired
	private PaquebotRepository paquebotRepo;


	@GetMapping("/")
	@ResponseBody
	public String home()
	{
		init();
		StringBuilder sb = new StringBuilder();
		sb.append("<h1>Regardez dans votre base de données MySQL <strong>JPA</strong></h1>");
		sb.append("<p>Vous devez avoir 2 tables dans votre base de données :</p>");
		sb.append("<ul><li><a href='http://localhost:8080/croisieres'>Liste des croisières enregistrées</a></li>");
		sb.append("<li><a href='http://localhost:8080/paquebots'>Liste des paquebots enregistrés</a></li></ul>");
		return  sb.toString();
	}

	@GetMapping(value = "/croisieres")
	public ResponseEntity<?> getAllCroisieres(){
		List<Croisiere> liste = null;
		try
		{
			liste = croisiereRepo.findAll();
		} catch (Exception e) {
			return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
		}

		return ResponseEntity.status(HttpStatus.OK).body(liste);
	}

	@GetMapping(value = "/paquebots")
	public ResponseEntity<?> getAllPaquebots(){
		List<Paquebot> liste = null;
		try
		{
			liste = paquebotRepo.findAll();
		} catch (Exception e) {
			return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
		}

		return ResponseEntity.status(HttpStatus.OK).body(liste);
	}

	/**
	 * Méthode d'initialisation (démo)
	 */
	private void init()
	{
		Paquebot p1 = new Paquebot("Queen Mary III", 50000);
		p1 = paquebotRepo.save(p1);

		Paquebot p2 = new Paquebot("Goeland ", 25000);
		p2 = paquebotRepo.save(p2);

		Croisiere c1 = new Croisiere("Mer Egée", 15);
		Croisiere c2 = new Croisiere("Mer Caspienne", 7);
		Croisiere c3 = new Croisiere("Adriatique", 8);
		c1.setPaquebot(p1);
		c2.setPaquebot(p1);
		c3.setPaquebot(p2);

		croisiereRepo.save(c1);
		croisiereRepo.save(c2);
		croisiereRepo.save(c3);

		//Modification de la durée (moins 2 jours) de la croisière Adriatique
		Croisiere croisiere = croisiereRepo.findByNom("Adriatique");
		if (croisiere != null) {
			croisiere.setDuree(croisiere.getDuree() - 2);
			croisiereRepo.saveAndFlush(croisiere);
		}

	}

}

Testez !

Voici le graphique (EER) de la BD :

tp9-uni-n-1.png

Retour vers les autres exercices