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 :

h:datatable non mis a jour


Sujet :

JSF Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 49
    Points : 48
    Points
    48
    Par défaut h:datatable non mis a jour
    Bonjour,

    je rencontre actuellement un petit problème relatif a mon h:datatable (meme resultat avec primefaces ).

    • j'affiche le contenu d'un array list qui est alimenté a partir d'une base de données.
    • j'ajoute des éléments a ma base de données , je réfréchi la page , les nouveaux éléments sont dans ma h:datatable.
    • j’édite un enregistrement dans ma base de données (sans passer par mon application )... je je rafraîchi la page ..et paf rien ? l'ancienne valeur de l'enregistrement est rendu.
    • j'ajout un nouveau élément a ma base de données , je je rafraîchi la page: la list avec le nouveau element est affiché ...mais pas le changement effectué précédemment dans l'enregistrement.


    remarques :

    • les changements que je fait sont directs sur le sgbd sans passer par
      l'interface de mon application.
    • si j'utilise mon application pour l'edition , les mise a jour sont directement reflétés sur mon h:datatable.


    quelqu'un pourrait m'expliquer ce comportement ?

  2. #2
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 49
    Points : 48
    Points
    48
    Par défaut
    autres détailles :
    si je modifie un attribut qui fait partie de la clé la mise a jour est reflété sur mon h:datatable.

    sinon pas de mise a jour

  3. #3
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    Pense à mettre le code incriminé ainsi que les erreurs affichés.
    Je pense qu'a ce moment il sera beaucoup plus facile pour les autres de t'aider
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 49
    Points : 48
    Points
    48
    Par défaut
    Bonsoir l'ami ,

    y a aucun message d'erreur ... les éditions , mis a jour , ajout , consultation qui sont directement fait a partir de mon application sont reflétés dans ma base de données et correctement affichées en jsf.

    l'anomalie survient quand je modifie manuellement un enregistrement dans la base de données sans passer par mon application web ( ligne de commande mysql ) si la modification ne touche pas l'id d'un record , elle n'est pas reflété dans mes pages jsf apres rafraîchissement.

    aucun message d'erreur ...rien.

    je sais pas si tu m'a compris.

  5. #5
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    C'est surement parcequ'il ya la meme chose sur la liste.
    Quand tu rafraichis il nya pas de requete dans la base de données donc les informations ne sont pas rafraichis.
    Le mieux que tu puisse faire c'est de faire un bouton qui renseigne ta liste avec une requete dans la base de données.

    Maiss le fait que les infos ne soit pas rafraichi est normal.
    Sinon quand tu redemarre l'application il ya les bonnes infos non ?
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 49
    Points : 48
    Points
    48
    Par défaut
    bonjour l'ami
    Quand tu rafraichis il nya pas de requete dans la base de données donc les informations ne sont pas rafraichis.
    il y a une requête vers la base de données seulement :
    le résultat est visible seulement si un changement a touché l'ID ( clé primaire par exemple) d'un enregistrement.
    si un attribut qui n'est pas une clé est modifié (dans la base de données par ligne de commande par exemple et sans passé par mon application) , ca ne se reflétera pas dans mon h:datatable.

    un peut de code :

    ma facade :

    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
    @Stateless
    public class CityFacade extends AbstractFacade<City> {
        @PersistenceContext(unitName = "TestPU")
        private EntityManager em;
    
        protected EntityManager getEntityManager() {
            return em;
        }
    
        public CityFacade() {
            super(City.class);
        }
    
         public List<City> findallcity(){
         Query query = em.createNamedQuery("City.findAll");
         return query.getResultList();
        }
    
    }
    mon 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
    .
    .
    .
    @ManagedBean
    @ViewScoped
    public class CityController {
     
    @EJB
    private CityFacade  cityFacade ;
    private List<City> cityList = new ArrayList<City>();
    private City city = new City();
     
     
        public CityController() {
        }
     
    public void SearchCity(){
     
         cityList =  cityFacade.findallcity();
     
       }
    .
    .
    .
    une partie de la page Jsf :

    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
    <h:form id="Mytable">
     
    <p:dataTable 
    id="citytable" 
    value="#{cityFacade.cityList}"
    var="item" >
     
                 <p:column>
                                    <f:facet name="header">
                                        <h:outputText value="Idcity"/>
                                    </f:facet>
                                    <h:outputText value="#{item.idcity}"/>
                 </p:column>
     
                 <p:column>
     
                                    <f:facet name="header">
                                        <h:outputText value="titre"/>
                                    </f:facet>
                                     <h:outputText value="#{item.titre}"/>
     
                 </p:column>
     
    </p:dataTable>
     
    <p:commandButton value="refrech"  action="#{cityFacade.SearchCity}" update="Mytable:citytable" />
     
              </h:form>
    si je click sur le bouton ma table est peuplée.
    si je modifie le titre d'une ville directement dans la base de données : puis je click sur refrech ....rien ne se passe.
    si je modifie l'id d'une ville ( dans ma base de données sans passé par mon application ) puis je click sur le bouton refrech , ma table est mise a jour.


  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Je pense que c'est normal, le comportement que tas !!
    En effet, tu modifie à la main!! si tu utilise un framework dans ta couche persistance comme Hibernate (tes beans sont déja chargés), donc si tu fais une modification (CRUD) à la main, lui il n'est pas au courant qu'il y a eu modification dans la base de données donc il ne te met pas à jour tes beans (objets)!!

    Je suis désolé j'ai pas regardé ton code, je me suis limité à ton premier message et la précisions qui a suivi !! et ça m'a semblé normal ce comportement.

    Si tu utilise un serveur d'application (jonas, jboss ...) essaye de le redémarrer tu va voir que tas les modifications que tu viens d'apporter s'afficher dans ton dataTable.

    Sinon, il faut penser autrement ...

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    normalement (si hibernate est bien configuré), les session hibernate ne durent que le temps de la requete, et donc tout appel à l'entityManager va créer de nouveau beans à chaque requete http.

    Par contre, si le cache de 2ème niveau a été mis en place dans hibernate, les données de ce cache auront priorité et seront utilisées avant de faire toute requete à la DB. Si vous décidez qu'il doit être possible de modifier la DB sans passer par votre application, vous ne pouvez pas utiliser un cache de second niveau.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2006
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Je suis d'accord avec toi tchize_, sauf que la il s'agit toujours de la même session parce qu'il te dit qu'il modifie à la mano directement dans sa BD,
    donc je pense et peut être je me trompe!! même en disant à Hibernate de recharger à chaque fois les objets mappé sur la base, il ne va pas le faire dans ce cas !!
    Même si on désactive le second level cache
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disabling hibernate's second level cache
    sauf si on lui demande peut être de rafraichir l'objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.refresh(votreObjet);
    ou encore mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    session.evict(votreObjet);
    session.update(votreObjet);
    Sinon j'aimerai bien avoir une explication bien en détail du fonctionnement car cela fait lgtmps que j'ai pas bien plongé dans Hibernate.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    L'EJB facade est stateless, il n'y a pas de raison pour que JPA préserve la session hibernate plus longtemps que la requête http qui a vu naître l'entitymanager. Si c'était un problème de session hibernate, il aurait d'autre soucis, notamment quand plusieurs utilisateurs seraient loggués simultanément . Si c'est le cache de second niveau qui cache les changement jouer avec session.evict ne servira à rien, le cache de second niveau ne stocke pas de beans.

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 49
    Points : 48
    Points
    48
    Par défaut

    Merci énormément les amis pour m'avoir mis sur la piste du cache ; a vrai dire j'avais des doutes mais je ne savais pas comment les formuler vue que je n'ai jamais était en contact avec cet aspect de la persistance.

    pour la persistance j'utilise EclipseLink 2 , et en fessant un tour sur la page :http://wiki.eclipse.org/EclipseLink/...es/JPA/Caching

    on peut voir plusieurs manières de faire , celle qui est interessante est la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query.setHint("javax.persistence.cache.storeMode", "REFRESH");
    en l'utilisant sur mon code

    public List<City> findallcity(){
    Query query = em.createNamedQuery("City.findAll");
    query.setHint("javax.persistence.cache.storeMode", "REFRESH");
    return query.getResultList();
    }
    aucun changement dans mon application....Et ça me laisse un peut perplexe.

    par contre l'utilisation du

    em.getEntityManagerFactory().getCache().evictAll();
    avant l’exécution de la Query a résolus le problème.

    une 3 ieme manière est l'utilisation des annotations @cache ... tres tentante ...je piocherai dans ce sens plus tard.

    bref par contre ca soulève une question : quel serait l’impact de l'utilisation ( ou de l'abus d'utilisation) de cette manière de faire.

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

Discussions similaires

  1. [DW CS3] Liens non mis à jour dans un modèle
    Par Aspic dans le forum Dreamweaver
    Réponses: 0
    Dernier message: 18/07/2008, 06h52
  2. [TortoiseSVN] Statut fichier non mis à jour
    Par jeffvac dans le forum Subversion
    Réponses: 6
    Dernier message: 16/04/2008, 11h43
  3. [AJAX] Incompatibilité avec IE (données non mis à jour)
    Par WeDgEMasTeR dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/05/2007, 19h46
  4. parametre non mis à jour
    Par rherrad dans le forum Struts 1
    Réponses: 2
    Dernier message: 11/04/2007, 13h35
  5. partie titre onglet non mis a jour
    Par mortalius dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 05/05/2006, 20h02

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