IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Mise à jour des champs d'une page JSF après modification dans une base de données


Sujet :

JSF Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 236
    Points : 127
    Points
    127
    Par défaut Mise à jour des champs d'une page JSF après modification dans une base de données
    Bonjour
    Je travaille sur le développement d'une interface qui interagit avec une base de données Oracle. J'ai un soucis avec une page qui doit afficher des informations récupéré dans une table qui est aussi utilisée par une deuxième application. Il se trouve que quand j'appelle la page pour la première fois, et que j'exécute la méthode pour récupérer les valeurs de la table, elle affiche correctement les informations en base. Par la suite, la deuxième application modifie les valeurs dans notre table. Après que les modifications soient effectuées, lorsque j'appelle à nouveau ma page, et que j’exécute la méthode qui récupère les valeurs dans la table, c'est toujours les valeurs récupérées avant modification qui s'affiche. Pourriez vous m'aider à résoudre ce problème? Merci
    Voici le code mis en œuvre pour l'interface sur laquelle je travaille
    Entity
    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
    19
    20
    21
    22
    23
    @Embeddable
    public class NetworkPK implements Serializable {
        @Basic(optional = false)
        @Column(name = "APPSRC")
        private Long appSrc;
        @Basic(optional = false)
        @Column(name = "MTI")
        private String mti;
        @Basic(optional = false)
        @Column(name = "FUNCTIONCODE")
        private String functionCode;
     
        // Constructeurs
     
    	// getter and setter
    	...
    	// hashCode 
    	...
    	// equals
    	...
    	// toString
     
    }
    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
    19
    20
    21
    22
    23
    24
    25
    26
    @Entity
    @Table(name = "NETWORK")
    @NamedQueries({
      ....
    })
    public class Network implements Serializable {
        private static final long serialVersionUID = 1L;
        @EmbeddedId
        protected NetworkPK networkPK;
        @Column(name = "SYSDATETIME")
        @Temporal(TemporalType.TIMESTAMP)
        private Date sysDateTime;
        @Column(name = "NUMB")
        private Long numb;
     
        // Constructeurs
     
    	// getter and setter
    	...
    	// hashCode 
    	...
    	// equals
    	...
    	// toString
     
    }
    Session
    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
    @Stateless
    public class SuiviExploitationFacadeBean implements SuiviExploitationFacade {
     
        @PersistenceContext(unitName = "safeconnect-ejbPU")
        private EntityManager em;
     
        ...
     
        @Override
        public Network findById(Long appSrc, String mti, String functionCode) {
            return em.find(Network.class, new NetworkPK(appSrc, mti, functionCode));
        }
     
        ...
     
    }
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @Stateless
    public class SuiviExploitationBean implements SuiviExploitation {
     
        @EJB SuiviExploitationFacade suiviEf;
     
        @Override
        public String etatSessionApplicative(Long appSrc, String mti, String functionCode){
    		String esa = null;
            Network network = new Network();
    		network = suiviEf.findById(appSrc, mti, functionCode);
            if (network.getNumb() == 1L)
                esa = "SIGN-OFF";
            else
                esa = "SIGN-ON";
            return esa;
        }
     
        @Override
        public Date dateHeure(Long appSrc, String mti, String functionCode){
            Network network = new Network();
    		network = suiviEf.findById(appSrc, mti, functionCode);
            return network.getSysDateTime();
        }
     
        @Override
        public Long echoTest(Long appSrc, String mti, String functionCode){
            Network network = new Network();
    		network = suiviEf.findById(appSrc, mti, functionCode);
            return network.getNumb();
        }
    }
    Managed Bean
    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
    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
    @ManagedBean(name = "exploitationController")
    @RequestScoped
    public class ExploitationController {
     
        @EJB 
        private SuiviExploitation suiviE;
        private String etatSessApp;
        private Date dateTranRec;
        private Date dateRepEnv;
        private Date dateSignOn;
        private Date dateSignOff;
        private Date dateMsgEchoTest;
        private Long valeur;
     
        // Constructeurs
        // getter et setter
        // methode utilisé pour appeler la page JSF. J'initialise tous les champs de la page avec null;
        public String reinitConnexionApp() {
            etatSessApp = null;
            dateTranRec = null;
            dateRepEnv = null;
            dateSignOn = null;
            dateSignOff = null;
            dateMsgEchoTest = null;
            valeur = null;
     
            return "exploit_appconn_view";
        }
     
        // méthode exécutée pour afficher les valeurs présentent dans notre table
        public String executerConnexionApp() {
    		appSrc = 1L;
            etatSessApp = suiviE.etatSessionApplicative(1L, "1804", "001");
            dateTranRec = suiviE.dateHeure(1L, "0002", "001");
           dateRepEnv = suiviE.dateHeure(1L, "0002", "000");
            dateSignOn = suiviE.dateHeure(1L, "1804", "001");
            dateSignOff = suiviE.dateHeure(1L, "1804", "002");
           dateMsgEchoTest = suiviE.dateHeure(1L, "1804", "270");
            valeur = suiviE.echoTest(1L, "1804", "270");
     
            return "exploit_appconn_view";
        }
    }
    Page JSF: exploit_appconn_view.xhtml
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <ui:define name="content">
    	<h1 class="title ui-widget-header ui-corner-all">
    		<h:outputText value="#{language.caTitre}" />
    	</h1>
    	<div class="entry">
    		<h:form prependId="false">
    			<p:messages showDetail="true"/>
     
    			<h:panelGrid columns="2">
    				<h:outputText value="Application source"/>
    				<h:inputText value="#{exploitationController.appSrc}" />
    				<h:outputText value="Etat Session Applicative"/>
    				<h:inputText value="#{exploitationController.etatSessApp}" />
    				<h:outputText value="Date heure dernière transaction reçue"/>
    				<h:inputText value="#{exploitationController.dateDernTranRec}">
    					<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
    				</h:inputText>
    				<h:outputText value="Date heure dernière reponse envoyée"/>
    				<h:inputText value="#{exploitationController.dateDernRepEnv}">
    					<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
    				</h:inputText>
    				<h:outputText value="Date heure dernier sign-on"/>
    				<h:inputText value="#{exploitationController.dateSignOn}">
    					<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
    				</h:inputText>
    				<h:outputText value="Date et heure dernier sing-off"/>
    				<h:inputText value="#{exploitationController.dateSignOff}">
    					<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
    				</h:inputText>
    			</h:panelGrid>
    			<h:panelGrid columns="4">
    				<h:outputText value="Date heure dernier message echo test"/>
    				<h:inputText value="#{exploitationController.dateDernMsgEchoTest}">
    					<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>
    				</h:inputText>
    				<h:outputText value="Valeur"/>
    				<h:inputText value="#{exploitationController.valEchoTest}"/>
    			</h:panelGrid>
    		</h:form>
    	</div>
    </ui:define>
    Si vous avez eventuellement besoin de savoir d'autres détails susceptibles de vous permettre de me donne un coup de main, n'hésitez pas à me le faire savoir.
    Merci d'avance

  2. #2
    Membre averti Avatar de Shinzul
    Homme Profil pro
    Lecteur assidu de code source
    Inscrit en
    Janvier 2008
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lecteur assidu de code source
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 174
    Points : 333
    Points
    333
    Par défaut
    Après une première lecture de ton code je ne voie pas de problème.

    As-tu essayer de rafraichir ta page en nettoyant le cache du navigateur ? Je sais que j'ai déjà eu quelques problèmes du à ce cache et que j'ai du supprimer dans un projet.
    Comme tu ne l'as pas indiqué, je part du principe que tu n'as pas essayé. si c'est déjà essayé je m'en vais chercher une autre cause possible

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Comment la 2eme appli sauvegarde-t-elle les données en base ?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 236
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Shinzul Voir le message
    Après une première lecture de ton code je ne voie pas de problème.

    As-tu essayer de rafraichir ta page en nettoyant le cache du navigateur ? Je sais que j'ai déjà eu quelques problèmes du à ce cache et que j'ai du supprimer dans un projet.
    Comme tu ne l'as pas indiqué, je part du principe que tu n'as pas essayé. si c'est déjà essayé je m'en vais chercher une autre cause possible
    J'ai vidé manuellement le cache mais le problème persiste

    Citation Envoyé par hedes Voir le message
    Comment la 2eme appli sauvegarde-t-elle les données en base ?
    voici le code de la seconde application qui effectue les modifications dans notre table. Je n'y ai pas vraiment travaillé
    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
    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
     
    public int SC_SetNetWork(String pcParamCode) {
     
    	String sql_stmt="", sql_stmt1="", sql_stmt2="", sql_stmt3="";
    	int SvcId=1;
    	logger.info("SC_SetNetWork   Begin ....code["+pcParamCode+"]");
     
    	try {
    		Statement stmt = null;
    		String SERVER_ADDRESS = ConnectionProperties.getProperty("SERVER_ADDRESS");
    		String SERVER_PORT = ConnectionProperties.getProperty("SERVER_PORT");
    		String DBNAME = ConnectionProperties.getProperty("DBNAME");
    		String PASSWORD = ConnectionProperties.getProperty("PASSWORD");
    		String USERNAME = ConnectionProperties.getProperty("USERNAME");
     
    		connexion = new SCcomm(SERVER_ADDRESS, SERVER_PORT, DBNAME, USERNAME,PASSWORD);
    		stmt = connexion.getCnx().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    		ResultSet rs = null;
    		int res= 0;
     
    		if (pcParamCode.equals("001")){    
     
    			sql_stmt = "update NETWORK  set NUMB=0,SYSDATETIME=sysdate where APPSRC="+SvcId+" and MTI='1804' and FUNCTIONCODE in ('001','002')";
    			sql_stmt1 = "update NETWORK  set NUMB=0,SYSDATETIME=sysdate where APPSRC="+SvcId+" and MTI='8888'";
    			res = stmt.executeUpdate(sql_stmt);
    			res = stmt.executeUpdate(sql_stmt1);
    		}
    		else{
    			if(pcParamCode.equals("002")){
    				sql_stmt = "update PNETWORK  set NUMB=1,SYSDATETIME=sysdate where APPSRC="+SvcId+" and MTI='1804' and FUNCTIONCODE in ('001','002')";
    				sql_stmt1 = "update PNETWORK  set NUMB=1,SYSDATETIME=sysdate where APPSRC="+SvcId+" and MTI='8888'";
    				res = stmt.executeUpdate(sql_stmt);
    				res = stmt.executeUpdate(sql_stmt1);
    			}
    			else{
    				if (pcParamCode.equals("270")){ 
    					sql_stmt = "update PNETWORK  set NUMB=(NUMB+1),SYSDATETIME=sysdate where APPSRC="+SvcId+" and MTI='1804' and FUNCTIONCODE='270'";
    					res = stmt.executeUpdate(sql_stmt);
    				}
    				else{
    					logger.error("SC_NetWork , no current function code["+pcParamCode+"]");
    					connexion.getCnx().close();
    					return 1;
    				}
    			}
    		}
    		if (res <= 0){
    			logger.error("SC_NetWork , update ");
    			connexion.getCnx().close();
    			return -1;
    		}
    		res = stmt.executeUpdate("commit");
    		logger.info("SC_SetNetWork   End ....");
    		connexion.getCnx().close();
    		return 0;
    	} 
    	catch (Exception e) {
    		logger.error("SC_SetNetWork   :" +e.getMessage());
    		return -1;
    	}
     }
    Merci pour vos réponses et de l’intérêt que vous accordez à mon problème

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Si la deuxième application accède directement à la base de données sans passer par JPA, as tu pensé à désactiver le cache côté JPA pour les données en question ?

    Il faudrait peut être aussi rajouter une colonne "version" et l'annotation @Version pour gérer les cas concurrentiels si vous mettez aussi à jour la base côté WEB.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 236
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par hedes Voir le message
    Si la deuxième application accède directement à la base de données sans passer par JPA, as tu pensé à désactiver le cache côté JPA pour les données en question ?

    Il faudrait peut être aussi rajouter une colonne "version" et l'annotation @Version pour gérer les cas concurrentiels si vous mettez aussi à jour la base côté WEB.
    Désactiver le cache côté JPA, je n'y avais jamais pensé. J'ai fait une recherche rapide sur le web et j'ai trouvé quelques indications que j'ai tout de suite mis en œuvre.
    Dans les propriétés de mon persistence.xml j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <property name="eclipselink.cache.shared.default" value="false"/>
    à mon entity j'ai ajouté l'annotation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Cache(
      type=CacheType.NONE, expiry=0, alwaysRefresh=true
    )
    et enfin dans ma session facade, avant de récupérer les données, j'ai ajouté cette ligne à ma méthode em.getEntityManagerFactory().getCache().evictAll();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Override
        public Network findNetwork(Long appSrc, String mti, String functionCode) {
        	em.getEntityManagerFactory().getCache().evictAll();
            return em.find(Network.class, new NetworkPK(appSrc, mti, functionCode));
        }
    Et depuis, ça marche
    Concernant la colonne version et l'annotation @version, je n'ai pas jugé utile de l'ajouter, parce que coté web on n'effectue pas des modifications sur la table. Néanmoins si je me trompe, faites le moi savoir.
    Merci encore pour toutes vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise à jour du Dataset après modification dans la base de donnée
    Par Ravens dans le forum Développement Windows
    Réponses: 7
    Dernier message: 03/06/2013, 22h01
  2. [MySQL] copier une page html après nettoyage dans une base mysql en php
    Par araoudiou dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/05/2007, 21h49
  3. Module de mise à jour des champs d'une table
    Par kikaillo dans le forum Access
    Réponses: 14
    Dernier message: 18/04/2006, 09h42
  4. Réponses: 1
    Dernier message: 04/04/2006, 11h29
  5. Réponses: 6
    Dernier message: 07/02/2006, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo