Bonjour, j'ai un Bean qui est @ManagedBean et @SessionScoped,
dans une de ses méthodes privées
de la j'appel MaFacade.findBySt
Dans ma classe final MaFacade j'ai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 final List<ParentEntity> parents = MaFacade.findBySt(oldId); for (final Parent parent : parents ) { for (EnfantEntity enfant : parent.getEnfants()) { enfant.setIdNull(); } }
Dans la liaison parent enfants dans mon entitée, si je suis EAGER tout bien
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 public static List<ParentEntity> findByStr(final Integer pId) { final EntityManager em = EntityManagerUtils.createEntityManager(); try { final Query findAllByStr = em.createNamedQuery("ParentEntity.findByStr"); findAllByStr.setParameter("strId", pId); final List<ParentEntity> res = findAllByStr.getResultList(); /* for (final ParentEntity parent : res) { for (EnfantEntity enfant : parent.getEnfants()) { } } */ return res; } finally { EntityManagerUtils.close(em); } }
getEnfants de ParentEntity, si je suis EAGER tout va bien car car getResults est appelé automatiquement à la création de
mais si je passe LAZY
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 @OneToMany(mappedBy = "enfant", fetch = FetchType.EAGER)//LAZY public List<EnfanttEntity> getEnfants() { if (_enfants == null) { _enfants = new ArrayList<EnfantEntity>(); } return _enfants; }
et bien j'ai org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: fr.ParentEntity.enfants, no session or session was closed
effectivement, au moment où j'appel getEnfants, il ne sont pas encore chargé en lazy et mon EntityManager est déjas close
mais bon, mon ManagedBean est @SessionScoped !
je peut décommenter mais appels à parent.getEnfants() pour que cela refonctionne mais cela ramène un peut à faire du EAGER!
Es-ce bien d'avoir mis mes bean en SessionScoped, ne devrai-je pas me mettre en RequestScoped et faire un close de l'EntityManager à la fin de ses Scopes?
Je croyais qu'il fallait éviter de tout monter en session, cela est il justifiable en JSF / PrimeFaces, il y il une raison de le faire?
Que me conseillez vous?
Partager