Bonjour.

J'ai un probleme simple avec hibernate et struts 2.

J'ai un objet Tarif qui contient une liste de tarifValeur :
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>
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).

Dans struts, je fais donc :
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;
    }
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
 
<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="&euro;"/></td>
					</tr>
 
				</c:forEach>
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
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 :
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>
Merci d'avance

Quelqu'un sait