Bonjour,

J'ai un projet (Spring - Hibernate) à rendre dans peu de temps pour ma FAC et je bloque sur la fin.
J'ai une BDD mysql en localhost dans laquelle j'ai une table 'Student' et une table 'SessionCours'. Et au milieu j'ai une table 'Inscription' qui prend l'id de l'étudiant et l'id de la session (Many to Many donc).

(Je m'excuse par avance de la longueur de mon message, mais j'essaye d'être le plus précis possible sur mon problème car j'ai vraiment besoin d'un peu d'aide )

Le code SQL :

Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE Student(
    ids INTEGER NOT NULL AUTO_INCREMENT, 
    noms VARCHAR(50) NOT NULL, 
    prenoms VARCHAR(50) NOT NULL,
    PRIMARY KEY (ids)
)
ENGINE=INNODB AUTO_INCREMENT=100;
 
CREATE TABLE SessionCours(
	idsess INTEGER NOT NULL AUTO_INCREMENT,
	idc INTEGER,
	idp INTEGER,
	datedeb DATE NOT NULL,
	datefin DATE NOT NULL,
	PRIMARY KEY (idsess),
	FOREIGN KEY (idc) REFERENCES Cours (idc),
	FOREIGN KEY (idp) REFERENCES Prof (idp)
)
ENGINE=INNODB AUTO_INCREMENT=2000;
 
CREATE TABLE Inscription(
	ids INTEGER,
	idsess INTEGER,
	PRIMARY KEY (ids, idsess),
	FOREIGN KEY (ids) REFERENCES Student (ids),
	FOREIGN KEY (idsess) REFERENCES SessionCours (idsess)
)
ENGINE=INNODB;

Certaines insertions sont déjà faites dans les trois tables. En effet, sur ma page web je peux voir mes tables et par exemple les session de cours où l'étudiant est inscrit (ce qui prouve que mon lien @ManyToMany fonctionne).

Voici quelques bout de codes afin d'avoir une vue plus précise sur le problème.

Les modèles Student.java et SessionCours.java :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
@Table(name="Student")
public class Student {
	@Id
	@Column(name="ids")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int ids;
	private String noms;
	private String prenoms;
 
	@ManyToMany(targetEntity = SessionCours.class, cascade = { CascadeType.ALL }, fetch = FetchType.EAGER )
	@JoinTable(name = "Inscription", 
				joinColumns = { @JoinColumn(name = "ids") }, 
				inverseJoinColumns = { @JoinColumn(name = "idsess") })
	private Set<SessionCours> inscSessions = new HashSet<SessionCours>();
 
// Getters et setters
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Entity
@Table(name="SessionCours")
public class SessionCours {
 
	@Id
	@Column(name="idsess")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int idsess;
	private Date datedeb;
	private Date datefin;
 
	@ManyToOne
	@JoinColumn(name="idc", nullable=false )
	private Cours unCours;
 
	@ManyToOne
	@JoinColumn(name="idp", nullable=false)
	private Prof unProf;
 
	@ManyToMany(mappedBy = "inscSessions", fetch = FetchType.EAGER)
	private Set<Student> lesEtudiants = new HashSet<Student>();
Comme vous pouvez le voir il y a aussi des liens @ManyToOne dans ma classe SessionCours (Une session possède UN prof et est liée à UN cours).

Voici mon DAO -> StudentDAOImpl.java (il y a donc les DAO et les Services de mes objets) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@Repository
public class StudentDAOImpl implements StudentDAO{
 
	private static final Logger logger = LoggerFactory.getLogger(StudentDAOImpl.class);
 
	private SessionFactory sessionFactory;
 
	public void setSessionFactory(SessionFactory sf){
		this.sessionFactory = sf;
	}
 
	@Override
	public void addStudent(Student p) {
		Session session = this.sessionFactory.getCurrentSession();
		session.saveOrUpdate(p);
		logger.info("Student saved successfully, Student Details="+p);
	}
 
	@Override
	public void updateStudent(Student p) {
		Session session = this.sessionFactory.getCurrentSession();
		session.update(p);
		logger.info("Student updated successfully, Student Details="+p);
	}
 
	@SuppressWarnings("unchecked")
	@Override
	public List<Student> listStudent() {
		Session session = this.sessionFactory.getCurrentSession();
		List<Student> studentList = session.createQuery("from Student").list();
		for(Student p : studentList){
			logger.info("Student List::"+p);
		}
		return studentList;
	}
 
	@Override
	public Student getStudentById(int ids) {
		Session session = this.sessionFactory.getCurrentSession();		
		Student p = (Student) session.load(Student.class, new Integer(ids));
		logger.info("Student loaded successfully, Student details="+p);
		return p;
	}
 
	@Override
	public void removeStudent(int ids) {
		Session session = this.sessionFactory.getCurrentSession();
		Student p = (Student) session.load(Student.class, new Integer(ids));
		if(null != p){
			session.delete(p);
		}
		logger.info("Student deleted successfully, Student details="+p);
	}
 
	/* ========== Sessions =================== */
 
	@SuppressWarnings("unchecked")
	@Override
	public Set<SessionCours> listSessions() {
		Session session = this.sessionFactory.getCurrentSession();
		List<SessionCours> tmp = session.createQuery("from SessionCours").list();
		Set<SessionCours> sessionList = new HashSet<SessionCours>(tmp); 
		for(SessionCours p : sessionList){
			logger.info("session List::"+p);
		}
		return sessionList;
	}
Sur la fin j'ai mis listSessions() qui me permettra de lister les sessions de l'étudiant. Il est vrai que je pourrais le mettre dans un fichier SessionDAO.java ...

Voici mon controller -> StudentController.java

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@Controller
public class StudentController {
 
private StudentService studentService;
 
	@Autowired(required=true)
	@Qualifier(value="studentService")
	public void setStudentService(StudentService ps){
		this.studentService = ps;
	}
 
	@RequestMapping(value = "/student", method = RequestMethod.GET)
	public String listStudent(Model model) {
		model.addAttribute("student", new Student());
		model.addAttribute("listStudent", this.studentService.listStudent());
		return "student";
	}
 
	//Fonction qui ajoute et modifie aussi 
	@RequestMapping(value= "/student/add", method = RequestMethod.POST)
	public String addStudent(@ModelAttribute("student") Student p){
 
		if(p.getIds() == 0){
			//new person, add it
			this.studentService.addStudent(p);
		}else{
			//existing person, call update
			this.studentService.updateStudent(p);
		}
 
		return "redirect:/student";
 
	}
 
	@RequestMapping("/removeStu/{ids}")
    public String removeStudent(@PathVariable("ids") int ids){
 
        this.studentService.removeStudent(ids);
        return "redirect:/student";
    }
 
    @RequestMapping("/editStu/{ids}")
    public String editStudent(@PathVariable("ids") int ids, Model model){
        model.addAttribute("student", this.studentService.getStudentById(ids));
        model.addAttribute("listStudent", this.studentService.listStudent());
        return "student";
    }
 
    @RequestMapping(value = "/entStu")
	public String getOneStudent(@RequestParam(value="ids") int ids, Model model) {
    	model.addAttribute("sess", new SessionCours());
		model.addAttribute("entStudent", this.studentService.getStudentById(ids));
		model.addAttribute("listStudent", this.studentService.listStudent());
		//Liste de toutes les sessions pour pouvoir s'inscrire
		model.addAttribute("listSessions", this.studentService.listSessions());
		return "entStudent";
	}
Et j'ai donc un JSP qui est en gros l'ENT de l'étudiant. Il y voit ses quelques informations, mais aussi les sessions dans lesquelles il est déjà inscrit et celles où il ne l'est pas.

Code jsp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<%@ include file="_include/header.jsp" %>
 
<body>
 
	<!--  Div à gauche -->
	<div style="width:45%;float:left">
		<h2> Espace enseignant </h2><br>
 
		<!--  Infos de l'enseignant  -->
		<ul>
			<li><span style="font-weight:bold;text-decoration:underline;">ID :</span> ${entStudent.ids}</li><br>
			<li><span style="font-weight:bold;text-decoration:underline;">Nom :</span> ${entStudent.noms}</li><br>
			<li><span style="font-weight:bold;text-decoration:underline;">Prenom :</span> ${entStudent.prenoms}</li><br>
		</ul>
 
		<!--  #################### Liste des sessions où il n'est pas inscrit #################### -->
		<!--  ############################ (et où il peut s'inscrire) ############################ -->
		<br><br>
		<h3> M'inscrire à une session ? </h3>
 
		<!--  Affichage liste de toutes les sessions -->
			<c:if test="${!empty listSessions}">
				<table class="tg">
				<tr>
					<th width="80">ID</th>
					<th width="120">Cours</th>
					<th width="170">Professeur</th>
					<th width="170">Date de début</th>
					<th width="170">Date de fin</th>
					<th width="120"></th>
 
				</tr>
				<c:forEach items="${listSessions}" var="session">
						<tr>
							<td>${session.idsess}"</td>
							<td>${session.getUnCours().titre}"</td>
							<td>${session.getUnProf().prenomp.charAt(0)}. ${session.getUnProf().nomp}"</td>
							<td>${session.datedeb}"</td>
							<td>${session.datefin}"</td>
							<!--  Variable de test -->
							<c:set var="test" value="0" />
							<c:forEach items="${session.getLesEtudiants()}" var="insc">
								<c:if test="${insc.ids == entStudent.ids}">
									<c:set var="test" value="1" />
								</c:if>
							</c:forEach>
							<c:if test="${test == 0}">
								<td><a href="<c:url value='/inscr/${session.idsess}' />" >S'inscrire</a></td>
							</c:if>
							<c:if test="${test == 1}">
								<td>Déjà inscrit</td>
							</c:if>
						</tr>
				</c:forEach>
				</table>
			</c:if>
 
		<!--  S'il n'y a aucune session .. peu probable ! -->
		<c:if test="${empty listSessions}">
			<h4 style="color:red">Il n'y a aucune session.</h4>
		</c:if>	
 
 
 
 
	</div>
 
	<!--  div à droite  -->
	<div style="width:55%;float:right">
 
		<h3> Liste des sessions où je suis inscrit :</h3>
 
		<!--  Affichage liste des sessions de l'étudiant -->
		<c:if test="${!empty entStudent.getInscSessions()}">
			<table class="tg">
			<tr>
				<th width="50">ID</th>
				<th width="120">Cours</th>
				<th width="120">Professeur</th>
				<th width="120">Date de début</th>
				<th width="120">Date de fin</th>
			</tr>
			<c:forEach items="${entStudent.getInscSessions()}" var="insc">
				<tr>
					<td>${insc.idsess}</td>
					<td>${insc.getUnCours().titre}</td>
					<td>${insc.getUnProf().prenomp.charAt(0)}. ${insc.getUnProf().nomp}</td>
					<td>${insc.datedeb}</td>
					<td>${insc.datefin}</td>
				</tr>
			</c:forEach>
			</table>
		</c:if>
 
		<!--  Si l'étudiant n'est inscrit à aucune des sessions -->
		<c:if test="${empty entStudent.getInscSessions()}">
			<h4 style="color:red">Vous n'êtes inscrit à aucune session.</h4>
		</c:if>	
 
	</div>
 
</body>
</html>

*** Un screenshot de la page que renvoit ma JSP =>
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nom : Capture d’écran_2019-01-23_02-30-12.png
Affichages : 122
Taille : 45,3 Ko
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Et donc mon problème (ENFIN ) : J'aimerais inscrire un étudiant en cliquant sur ma balise <a> s'inscrire.
Pour l'instant j'ai mis un simple lien en GET. Je me dis qu'en récupérant l'id de la session je pourrais retrouver la session dans mon controller puis ajouter la session en question dans le Set<SessionCours> de ma classe Student.
Mais j'ai essayé plusieurs choses différentes et j'ai plusieurs erreurs différentes (notamment une qui me dit que la Session courante n'est pas trouvée je crois ; lorsque que je tente de faire un getSessionById .. (Fonction que j'ai retirée, vous ne la trouverez pas).
J'ai aussi tenté de faire un formulaire (<c:form ...>) avec un foreach pour avoir un formulaire à chaque ligne de ma table afin d'envoyer une requête post. Mais ça ne marchait pas non plus. Je le faisais sûrement mal, tout simplement.
Mais mon problème vient de la gestion dans mon controller. Je ne sais juste pas ce qu'il faut faire (malgré mes recherches).

En gros, j'aimerais sincèrement que quelqu'un m'amène vers la solution svp.
Est-ce qu'une âme charitable pourrait me dire (même à peu près) ce qu'il faut faire ?
Et même m'expliquer techniquement ce qu'il faut faire. Je pense réellement ne pas avoir bien compris comment ajouter concrètement quelque chose dans cette table 'Inscription'.