Bonjour,
Dans le cadre d'un développement JAVA je me dois d'implémenter ce modèle de donnée (qui fait parti d'un plus gros ensemble) :
Ma relation ManyToMany possède des attributs.Je n'ai donc pas le droit d'utiliser l'annotation @ManyToMany. Je suis obligé de passer par une classe qui fera ma liaison avec deux annotations @ManyToOne
Mes classes sont donc :
Classe Prestation
Classe Intervenant
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 public class Prestation implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String intitulé ; @Temporal(javax.persistence.TemporalType.DATE) private Date date_début; @OneToMany(mappedBy = "prestation" ) private List<Entity_Liaison_Intervenant_prestation> liaison_Intervenant = new ArrayList<Entity_Liaison_Intervenant_prestation> ();
Classe Liaison
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 @Entity public class Intervenant implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String nom; private String prénom; @OneToMany(mappedBy = "intervenant") private List<Entity_Liaison_Intervenant_prestation> liaison_Prestation = new ArrayList<Entity_Liaison_Intervenant_prestation> ();
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 public class Entity_Liaison_Intervenant_prestation implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private static final long serialVersionUID = 1L; @ManyToOne(fetch = FetchType.EAGER, optional = false) private Intervenant intervenant; @ManyToOne(fetch = FetchType.EAGER, optional = false) private Prestation prestation; @Temporal(javax.persistence.TemporalType.DATE) private Date date; @Enumerated(EnumType.STRING) private Etat_Intervenant role_intervenant;
J'ajoute sans problème un nouvel intervenant à ma prestation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Intervenant intervenant_à_ajouter = (Intervenant)comboIntervenants.getSelectedObjects()[0]; Entity_Liaison_Intervenant_Prestation liaison_à_ajouter = new Entity_Liaison_Intervenant_Prestation(); liaison_à_ajouter.setRole_intervenant(Etat_Intervenant.babysitter); liaison_à_ajouter.setIntervenant(intervenant_à_ajouter); liaison_à_ajouter.setPrestation(PrestationEnCours);
En revanche, quand je veux récupérer tous mes intervenants qui ont eu un rôle pendant ma prestation, et bien c'est le drame :
Mon code qui appelle l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 16 sept. 2011 14:04:02 org.hibernate.LazyInitializationException <init> GRAVE: failed to lazily initialize a collection of role: application.entity.Prestation.liaison_Intervenant, no session or session was closed
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for (Entity_Liaison_Intervenant_Prestation liaison : PrestationEnCours.getLiaison_Intervenant()) System.out.println(liaison.getId());
Bref je comprend pas pourquoi j'ai une erreur "Lazy" alors que ma relation est annotée FetchType.EAGER (qui d'ailleurs est le comportement par défaut) !
Merci d'avance pour vos conseils !
Partager