Bonjour.
J'ai un probleme simple avec hibernate et struts 2.
J'ai un objet Tarif qui contient une liste de tarifValeur :
Sur la page jsp qui affiche la liste des tarifs, je peux cliquer sur un lien qui affiche le détail de celui-ci (dont ces valeurs).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <class name="cpte.hibernate.CpteTarif" table="CPTE_TARIF"> .... <set name="cpteTarifvaleurs" table="CPTE_TARIFVALEUR" inverse="true" lazy="true" cascade="all" fetch="select"> <key> <column name="TAR_ID" precision="22" scale="0" not-null="true" /> </key> <one-to-many class="cpte.hibernate.CpteTarifvaleur" /> </set> </class>
Dans struts, je fais donc :
puis dans la jsp qui suis, j'ai le code suivant :
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 public String loadTarif() throws Exception { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); long tarifId = Long.parseLong(request.getParameter("tarif.tarId")); tarif = CpteTarifDao.getInstance().get(tarifId); if(tarif==null) { addActionError(getText("error.baseDeDonnees")); return INPUT; } HibernateUtil.closeSession(); return SUCCESS; }Ce code affiche l'erreur : org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cpte.hibernate.CpteTarif.cpteTarifvaleurs, could not initialize proxy - no Session
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <c:forEach var="tarifValeur" items="${tarif.cpteTarifvaleurs}" varStatus="status"> <tr> <td>${tarifValeur.valId}</td> <td><fmt:formatDate pattern="dd/MM/yyyy" value="${tarifValeur.valDateEffet}"/></td> <td><fmt:formatDate pattern="dd/MM/yyyy" value="${tarifValeur.valDateFin}"/></td> <td><fmt:formatNumber value="${tarifValeur.valMontant}" type="currency" currencySymbol="€"/></td> </tr> </c:forEach>
car la session est close (je la ferme dans loadTarif()).
Bien sur, si je ne ferme pas la session préalablement, ca fonctionne correctement, mais j'avais vu que ne pas fermer une session pouvait poser des problèmes lors d'update dans un précédent message sur le forum.
Doit-on mettre dans chaque jsp une ouverture de session hibernate en début et une fermeture en fin? je ne pense pas que c'est la solution non plus...
Je ne souhaite pas utiliser le mode "eager". Le chargement à la demande m'a l'air mieux car ca ne va pas tout charger dès le début.
OButterlin : dans un précédent message vous disiez :
.Dans mon exemple, effectivement, il n'y a pas l'ouverture/fermeture de la session parce que c'est géré au niveau d'un filtre.
La session est ouverte en début de request et fermée en fin de response.
Comment faire cela sachant qu'il y a deja un filtre sur mon application :Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Quelqu'un sait
Partager