Coucou ! C'est encore moi !
Suite à l'aide efficace, notamment de tchize, j'ai maintenant le bon affichage quand l'étudiant qui se connecte est inscrit à un stage.
Sous ce texte d'accueil, à la place du bouton "Voir les stages", j'affiche un bouton "Me désinscrire" qui, comme son nom l'indique, doit effacer l'inscription de l'étudiant au stage, laquelle est physiquement enregistrée dans une table associative de ma BDD.Bonjour Test Test.
Vous êtes inscrit au stage Histoire, du 2011-05-03 au 2011-05-20, dans l'établissement EPLEA Capou de Montauban (82).
Rappel du morceau de MCD concerné :
ThStageStg -(1,1)----Etre----1,1- TeSessionSsn -0,n----Inscrire----0,n- ThCandidatCnd -(1,1)----Etre----0,1- ThUtilisateurUti
J'ai donc créé une méthode desinscrire() dans AccueilEtudiant.java :
=> Celle-ci fait appel à la méthode removeFromCandidat de TeSessionSsn que j'ai écrite en suivant cet exemple du manuel de référence d'Hibernate, au chapitre 1.3.6.
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 /** * desinscrire * Désinscrit l'étudiant de son stage * @return String retour à la page d'accueil de l'étudiant */ public String desinscrire() { log.info("accueilEtudiant.desinscrire() "); // Instanciation du user en tant que candidat pour accéder à la session à laquelle est inscrit le candidat ThCandidatCnd candidat = (ThCandidatCnd) user; log.info("accueilEtudiant.desinscrire() - après instanciation candidat"); stage.removeFromCandidat(candidat); log.info("accueilEtudiant.desinscrire() après remove"); return "/AccueilEtudiant.xhtml"; }
Voici la méthode que j'ai écrite dans TeSessionSsn dont hérite ThStageStg :1.3.6. Travailler avec des liens bidirectionnels
Premièrement, gardez à l'esprit qu'Hibernate n'affecte pas la sémantique normale de Java. Comment avons-nous créé un lien entre une Person et un Event dans l'exemple unidirectionnel ? Nous avons ajouté une instance de Event à la collection des références d'événement d'une instance de Person. Donc, évidemment, si vous voulons rendre ce lien bidirectionnel, nous devons faire la même chose de l'autre côté - ajouter une référence de Person à la collection d'un Event. Cette "configuration du lien des deux côtés" est absolument nécessaire et vous ne devriez jamais oublier de le faire.
Beaucoup de développeurs programment de manière défensive et créent des méthodes de gestion de lien pour affecter correctement les deux côtés, par exemple dans Person :
protected Set getEvents() {
return events;
}
protected void setEvents(Set events) {
this.events = events;
}
public void addToEvent(Event event) {
this.getEvents().add(event);
event.getParticipants().add(this);
}
public void removeFromEvent(Event event) {
this.getEvents().remove(event);
event.getParticipants().remove(this);
}
Sauf que j'ai un beau message d'erreur à l'exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /** * removeFromCandidat * Suppression d'une inscription d'un candidat à cette session * @param ThCandidatCnd candidat : le candidat dont il faut supprimer l'inscription à cette session */ public void removeFromCandidat(ThCandidatCnd candidat) { this.getThCandidatCnds().remove(candidat); candidat.getTeSessionSsns().remove(this); }
Cela veut-il dire qu'il faut que j'aille chercher la session de l'entityManager pour utiliser user et stage qui sont importés et dont pourtant je lis bien les propriétés dans la page AccueilEtudiant ?16:49:23,638 INFO [AccueilEtudiant] accueilEtudiant.desinscrire()
16:49:23,638 INFO [AccueilEtudiant] accueilEtudiant.desinscrire() - après instanciation candidat
16:49:23,639 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.domain.stamas.entity.TeSessionSsn.thCandidatCnds, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
...
Pas après pas, j'y arriverai !
Partager