SessionScoped et RequestScoped, LazyLoading et EntityManagerUtils.close
Bonjour, j'ai un Bean qui est @ManagedBean et @SessionScoped,
dans une de ses méthodes privées
de la j'appel MaFacade.findBySt
Code:
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 ma classe final MaFacade j'ai
Code:
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);
}
} |
Dans la liaison parent enfants dans mon entitée, si je suis EAGER tout bien
getEnfants de ParentEntity, si je suis EAGER tout va bien car car getResults est appelé automatiquement à la création de
Code:
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;
} |
mais si je passe LAZY
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?