Bonjour.
1/
Sur certains sites, j'ai vu que l'update était différent :
lors de l'appel à monObjetDAO.updateObjet(monobjetmodifié).
la méthode à l'intérieur était :
2/Dans votre exemple avec clientDAO, je ne vois pas non plus de close()?Code:
1
2
3 monobjet2 = ..getSession().get(monobjetmodifié.getId) monobjet2.setTousLesValeurs(monobjetmodifié) update(monobjet2);
3/ Sur le support Hibernatehttps://docs.jboss.org/hibernate/cor...e-saveorupdate, ils parlent de la methode saveOrUpdate(), celle-ci ne peut pas résoudre le probleme?
4/Comme demandé, Voici mon code qui permet de voir la cinématique générale :
fichier struts 2
fichier de mapping d'un locataire :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <!-- Acces aux Locataires via le menu --> <action name="Locataire" class="cpte.pages.admin.locataire.PageLocataireAction"> <result name="success" type="redirectAction">LocatairesConsulter</result> </action> <!-- Locataires : consulter les Locataires --> <action name="LocatairesConsulter" class="cpte.pages.admin.locataire.PageLocataireAction" method="consulterLocataires"> <result>/pages/admin/locataire/pageLocatairesConsulter.jsp</result> </action> <!-- Locataires : modifier un locataire --> <action name="LocataireModifier" class="cpte.pages.admin.locataire.PageLocataireAction" method="loadLocataire"> <result name="success">/pages/admin/locataire/pageLocataireModifier.jsp</result> <result name="input">/pages/admin/locataire/pageLocataireModifier.jsp</result> </action> <!-- Tarifs : modifier un locataire / valider --> <action name="LocataireModifierValider" class="cpte.pages.admin.locataire.PageLocataireAction" method="validerLocataire"> <result name="input">/pages/admin/locataire/pageLocataireModifier.jsp</result> <result name="success" type="redirectAction"> <param name="actionName">LocatairesConsulter</param> </result> </action>
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 28 f?vr. 2014 16:38:27 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="cpte.hibernate.CpteLocataire" table="CPTE_LOCATAIRE"> <id name="locId" type="long"> <column name="LOC_ID" precision="22" scale="0" /> <generator class="increment"></generator> </id> <property name="locCodeClient" type="long"> <column name="LOC_CODE_CLIENT" precision="22" scale="0" not-null="true" /> </property> <property name="locRaisonSociale" type="string"> <column name="LOC_RAISON_SOCIALE" length="80" not-null="true" /> </property> <property name="locDateEffet" type="date"> <column name="LOC_DATE_EFFET" length="7" not-null="true" /> </property> <property name="locDateFin" type="date"> <column name="LOC_DATE_FIN" length="7" /> </property> <property name="locExterne" type="boolean"> <column name="LOC_EXTERNE" precision="1" scale="0" not-null="true" /> </property> </class> </hibernate-mapping>
Première action, j'affiche les locataires via la methode "consulterLocataires":
J'arrive donc sur une page contenant un tableau avec un lien modifier en fin de chaque ligne. Voici le jsp :Code:
1
2
3
4
5 public String consulterLocataires() { listeLocataires = CpteLocataireDao.getInstance().listAll(); return SUCCESS; }
Lorsque je clique sur le lien modifier, la methode "loadLocataire" est appelée :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <c:forEach var="locataire" items="${listeLocataires}" varStatus="status"> <tr> <td>${locataire.locId}</td> <td>${locataire.locCodeClient}</td> <td>${locataire.locRaisonSociale}</td> <td><fmt:formatDate pattern="dd/MM/yyyy" value="${locataire.locDateEffet}"/></td> <td><fmt:formatDate pattern="dd/MM/yyyy" value="${locataire.locDateFin}"/></td> <td>${locataire.locExterne}</td> <td> <a href="LocataireModifier?locataire.locId=${locataire.locId}"> <s:text name="%{getText('label.modifier')}" /> </a> </td> </tr> </c:forEach>
J'arrive lors sur la page jsp permettant d'afficher le locataire et donc de modifier les différentes valeurs :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public String loadLocataire() throws Exception { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); long locataireId = Long.parseLong(request.getParameter("locataire.locId")); //tarif = new TarifDAO().findById(listeTarifs,tarifId); locataire = CpteLocataireDao.getInstance().get(locataireId); if(locataire==null) { addActionError(getText("error.baseDeDonnees")); return INPUT; } return SUCCESS; }
Lorsque je valide, la methode "validerLocataire" est appelée, donc voici le code complet :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <s:form name="locataireForm" > <s:textfield name="locataire.locId" readonly="true" required="true" label="%{getText('label.locataire.id')}" /> <s:textfield name="locataire.locCodeClient" required="true" label="%{getText('label.locataire.codeClient')}" /> <s:textfield name="locataire.locRaisonSociale" required="true" label="%{getText('label.locataire.raisonSociale')}" /> <s:textfield name="locataire.locDateEffet" required="true" id="locataire_dateEffet" label="%{getText('label.locataire.dateEffet')}" /> <s:textfield name="locataire.locDateFin" id="locataire_dateFin" label="%{getText('label.locataire.dateFin')}" /> <s:checkbox name="locataire.locExterne" required="true" label="%{getText('label.locataire.locataireExterne')}" labelposition="left"/> </s:form>
Pour votre information, voici le code de la methode findByRaisonSociale :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public String validerLocataire() throws Exception { String codeRetour=INPUT; CpteLocataire locataireAvecMemeRaisonSociale = CpteLocataireDao.getInstance().findByRaisonSociale(locataire.getLocRaisonSociale()); if(locataire.getLocId()==0) { log.debug("validation creation d'un locataire"); //Vérification qu'un locataire n'existe pas avec la meme raisonSociale if(locataireAvecMemeRaisonSociale != null) { addActionError(getText("error.locataire.locataireExistant")); } if(hasErrors() == false) { //Par défaut, la date de debut sera egale à la date du jour, si elle n'est pas renseignee if(locataire.getLocDateEffet()==null) { locataire.setLocDateEffet(new Date()); } log.debug("creation du locataire : "+locataire.getLocRaisonSociale()); try { HibernateUtil.currentSession().beginTransaction(); CpteLocataireDao.getInstance().save(locataire); HibernateUtil.currentSession().getTransaction().commit(); codeRetour=SUCCESS; } catch (HibernateException e) { codeRetour=INPUT; log.error(Util.getStackTrace(e)); } } } else { log.debug("validation modification du locataire"); //TODO controle modification locataire : si contrats --> alors modif codeClient/raisonsociale/dateeddet interdite //Vérification qu'un locataire n'existe pas avec la meme raisonSociale pour un id différent if(locataireAvecMemeRaisonSociale != null && locataireAvecMemeRaisonSociale.getLocId() != locataire.getLocId()) { addActionError(getText("error.locataire.locataireExistant")); } if(hasErrors() == false) { log.debug("mise à jour du locataire : "+locataire.getLocRaisonSociale()); try { HibernateUtil.currentSession().beginTransaction(); CpteLocataireDao.getInstance().update(locataire); HibernateUtil.currentSession().getTransaction().commit(); codeRetour=SUCCESS; } catch (HibernateException e) { codeRetour=INPUT; log.error(Util.getStackTrace(e)); } } } if(hasErrors()==false && INPUT.equals(codeRetour)) { addActionError(getText("error.baseDeDonnees")); } return codeRetour; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public CpteLocataire findByRaisonSociale(String raisonSociale) { CpteLocataire locataire = null; Criteria query = getHibernateSession().createCriteria(clazz); query.add(Restrictions.eq( "locRaisonSociale", raisonSociale)); @SuppressWarnings("unchecked") List<CpteLocataire> listeLocataires = query.list(); if(listeLocataires.isEmpty() == false) { locataire=listeLocataires.get(0); } return locataire; }
J'espère que ce code pourras vous aider. Celui-ci étant pour l'instant très simple, vu que ce n'est qu'une lecture puis modification