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

Persistance des données Java Discussion :

Synchronisation des informations de la base de données avec les objets java


Sujet :

Persistance des données Java

  1. #1
    Membre à l'essai
    Synchronisation des informations de la base de données avec les objets java
    Salut!
    Je suis entrain de développer deux applications web JEE, qui communiquent entre elles via un web service Restfull. En ce qui concerne la persistance j'utilise l'ORM JPA que j'implémente avec eclipse-Link.
    Mon architecture est la suivante : La première application communique directement avec la base de données, la deuxième communique avec la base de données en passant par le web service mis en place.
    Lorsque la première application insère les données dans la base de données, les informations sont automatiquement remontées sur la deuxième application.
    Mais lorsque la deuxièmement application fait une insertion à la base de données, l'insertion est réussie mais la première application ne remonte pas ces informations automatiquement tandis que les données insérées sont bien dans la base. Les informations remontent lorsque je redéploie la première application sur mon serveur.
    Je me demande s'il existe une méthode qui permet de synchroniser automatiquement les informations insérées dans ma base de données avec mes objets.

  2. #2
    Expert éminent sénior
    il faudrait que tu nous décrive un peu mieux ton archiutecture. Pour ce que je comprend de ta description, c'est l'application 1 qui fait les insertions / récupération et expose un web service à l'application 2. Donc c'est à ton code de l'application 1 d'éviter de garder en mémoire des trucs qui ne sont plus valide. Il le sait très bien que ce n'est plus valide puisque c'est lui qui a modifié les données.
    Maintenant il faudrait que tu nous décrive comment ton application 1 garde ses données en mémoire car JPA normalement va rechercher les objets sur la DB à chaque appel.
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  3. #3
    Membre à l'essai
    Citation Envoyé par tchize_ Voir le message
    il faudrait que tu nous décrive un peu mieux ton archiutecture.
    Voici mon architecture:
    L'application 1 est faite avec le framework JEE Vraptor 4,La deuxième application est faite en JSF 2.2 et mon web service Restfull est fait avec Jersey.
    Le problème se pose lors de la récupération des données provenant de la base par l'application 1 après insertion par l'application 2.Je constate comme si la JPA n'actualise pas mes objets automatiquement. Elle actualise mes objets lorsque je redéploie mon application sur mon serveur glassfish.
    En résume lorsque l'application 2 fait une insertion,les données sont bien logées dans la BD,mais ne sont pas remontées automatiquement à l'application 1,sauf si je redéploie cette dernier sur mon serveur.

  4. #4
    Expert éminent sénior
    L'application 2 accède directement à la DB ou passe par le service de l'application 1?

    Comment tu gère ton cache (si tu en as un)?
    Comment tu récupère tes données?
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  5. #5
    Membre à l'essai
    Citation Envoyé par tchize_ Voir le message
    L'application 2 accède directement à la DB ou passe par le service de l'application 1?

    Comment tu gère ton cache (si tu en as un)?
    Comment tu récupère tes données?
    L'application 2 passe par le web service pour insérer dans la BD,c'est l'application 1 qui a un accès direct à la BD,et elle quand elle insère, les données sont automatiquement affichées sur l'application 2.
    Je n'ai pas de cache.
    voici la méthode qui exécute ma requête de récupération des données au niveau de l'application 1,c'est une requête nommée.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public List<Ristourne> findByFlag(Integer flag) {
            List<Ristourne> ristourne = null;
            try {
                ristourne = em.createNamedQuery("Ristourne.findByFlag", Ristourne.class)
                        .setParameter("flag", flag)
                        .getResultList();
            } catch (NoResultException e) {
     
            }
            return ristourne;
        }

    Le code de ma requête nommée:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    @NamedQuery(name = "Ristourne.findByFlag", query = "SELECT u FROM Ristourne u WHERE u.flag=:flag")

    Le code au niveau de mon service web qui permet de mettre à jour la BD
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                     positionnement.setCarte(carte);
                        positionnement.setRistourne(ristourne);
                        em.persist(positionnement);
                        //Le nombre d'inscrit augmente de  1
                        int nombreInscrit=ristourne.getInscrit()+1;
                        ristourne.setInscrit(nombreInscrit);
                        //On ferme la ristourne si le quota est atteint
                        if (ristourne.getInscrit() == ristourne.getNombreDePersonne()) {
                            ristourne.setFlag(2);
                        }
                        em.merge(ristourne);

  6. #6
    Membre à l'essai
    J'ai pu trouvé la solution à mon problème,il suffisait juste que j'utilise la méthode refresh de la classe EntityManager après ma requête de sélection pour rafraîchir mon graphe d'objets.