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

Java EE Discussion :

Synchronisation des CMP entity bean 3.0 avec la BD [EJB3 Entity]


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Synchronisation des CMP entity bean 3.0 avec la BD
    Bonjour,

    J'ai une base de données qui est utilisée par plusieurs applications dont une qui utilise les CMP entity bean 3.0.

    Donc j'aimerais savoir comment synchroniser mes entity beans avec la base de données lorsque cette dernière a été modifiée par une autre application.

    A l'heure actuelle, si je modifie des données de la base, par exemple avec SQL+, l'application qui utilise les entity beans ne tient pas compte des modifications.


    Merci

  2. #2
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Tu peux resynchroniser tes EJB avec la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EntityManager.refresh(Object obj)
    C'est généralement de que l'on fait lorsque on utilise un objet détaché d'une transaction pour le resynchroniser avec la transaction courante.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Merci pour ta réponse xv-mnt.

    T'es aussi de Suisse ?

    Le problème c'est que je ne sais pas quel objet rafraichir. Puisque n'importe quel donnée peut être mise à jour.

    Faudrait pouvoir rafraichir tout les objets "entity bean".

    Ou alors j'ai loupé quelque choses, Je découvre les EJB.

  4. #4
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Normalement tu dois resynchroniser toutes les entités que tu vas manipuler dans ta transaction. Pour les EJB 3.0, lors de la declaration des liens, tu précises ce que tu vas cascader (PERSIST, MERGE, REFRESH, REMOVE). Tu vas donc propager le refresh à tous les objets liés par un lien pour peu que chaque lien cascade le refresh.
    Tous les objets qui sont retrieves via une requete EJBQL sont synchronisés au sein de la transaction où tu as effectué la requête ; tu n'as donc pas de refresh à faire.
    Par contre, si tu utilises ton EJB hors d'une transaction, il sera alors "détaché" et lors de la mise à jour en DB suivante, tu devras le réattacher à la transaction suivante, d'où le refresh.

    J'suis pas très clair, mais tu peux en savoir plus en lisant n'importe quelle doc sur les EJB3, chapitre transactions
    Tu peux aussi lire la spéc. EJB3 de SUN (en anglais) qui est très bien faite : JSR 220.

    PS : de bleu, de bleu !!
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Je te fais un petit exemple:

    Voici une simple entity bean (sans liens):

    @Entity
    @NamedQuery(name="findAllPerson", query="select object(p) from person p")
    @Table(name="Person")
    public class Person implements Serializable {
    @Id
    private String id;
    private String nom;
    private String prenom;

    //constructor, getter and setter..

    }


    Maintenant par exemple dans un session bean j'ai cette méthode:

    public List<Person> findAllPerson() {
    return em.createNamedQuery("findAllPerson").getResultList();
    }

    Je lance l'applic et les valeurs s'affichent.
    Maintenant si je modifie une valeur dans la base avec SQL+, l'applic ne voit pas la modif (à moins que je ne restart le serveur).


    J'ai posté la même question sur le forum de sun et en résumé il m'on répondu qu'il n'est pas possible de synchroniser les entity beans avec la base.

    voici le thread posté chez sun: http://forum.java.sun.com/thread.jsp...84368&tstart=0

    Ca fait depuis hier que je cherche la solution à mon problème.

    J'ai besoin de ton aide compatriote.

    Merci

  6. #6
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    1- Si tu ne fais rien, la liste ne va pas se rafraichir toute seule, car la base ne notifie pas ses changements à toutes les applis qui y sont connectées. C'est donc les applis qui doivent redemander les valeurs.

    2- Si tu relance la requête, la liste change-t-elle ?
    Si oui, tu as gagné
    Si non, c'est que tu utilises sans doute un cache de second niveau (applicatif). Ce peut être par exemple un cache pluggé à Hibernate.
    Pour invalider le cache, utilise cette propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
    Si tu n'as pas de cache, je ne comprends pas car la requête doit se réexécuter.
    Pour vérifier, active les traces log4j d'hibernate, dans log4j.properties, mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #log4j.logger.org.hibernate.SQL=DEBUG
    Bon WE...
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Oui j'ai fait en sorte que l'applic rexecute la requete lorsque je rafraichi la page mais le résultat ne change pas.

    Je pense que le serveur execute la requête sur les entity beans et non sur la base de données ?

    Je vais voir le problème du cache lundi.
    Mais j'utlise pas hybernate moi..

    Dans tous les cas, je te remercie.
    Bon wkd.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    C'était bien un problème de cache.

    Pour résoudre le problème j'ai du rajouter les quelques lignes ci-dessous dans le fichier persistance.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <persistence-unit name="Model">
         <properties>
            <property name="toplink.cache.type.default" value="NONE"/>
        </properties>
      </persistence-unit>

    Merci pour tout !

  9. #9
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    No problemo !
    En fait, j'utilise l'impl. d'Hibernate pour les EJB3, d'où mes paramètres.
    Juste une remarque, si tu enlèves ton cache tu risques d'avoir des perfs moins bonnes.
    je te conseille de creuser un peu pour garder le caching, et voir comment invalider certaines données du cache pour forcer le refresh via la DB.

    N'oublie pas le flag !!
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Oui je sais, cette solution est temporaire. Lorsque toute l'application sera migrée (eh oui..) j'activerai à nouveau le caching.


    Merci et tout de bon !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/12/2011, 20h53
  2. Réponses: 4
    Dernier message: 11/01/2008, 11h26
  3. problème de deploiement d'un Entity Bean CMP
    Par med56 dans le forum JOnAS
    Réponses: 1
    Dernier message: 19/09/2006, 12h32
  4. Synchronisation des Données avec SQL Server 2005
    Par attouchi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/07/2006, 16h14
  5. [ Entity bean ] CMP
    Par hocinema dans le forum Websphere
    Réponses: 5
    Dernier message: 03/10/2003, 11h33

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