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

Hibernate Java Discussion :

[hib 3.2.5] Criteria : Pb de lecture apres enregistrement


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut [hib 3.2.5] Criteria : Pb de lecture apres enregistrement
    Bonjour à tous,

    Je rencontre un pb tenace sous une application Web Struts/mySql/Hibernate

    Une page d'administration (par exemple) me permet de gérer une table simple (ajout, modification, suppression) via des champs de formulaire.

    si je met à jour un enregistrement, la base MySQL est correctement mise à jour, l'enregistrement est correctement rechargé (via un createCriteria()), et affiché en retour à l'utilisateur.

    L'utilisation d'un bouton "refresh" (qui relance le meme createCriteria() qu'après l'update) me pose de gros pboblèmes :
    De façon aléatoire, ce sont les anciennes valeurs qui sont affichées en retour. Un coup de debug me montre qu'hibernate est alors persuadé que ce sont réellement les données de mon objet.

    Sentant des pb de cache (alors que le cache de 2eme niveau est désactivé), j'ai rajouté quelques options espérant résoudre mon pb, mais sans succès (setFlushMode(), setCacheMode(), session.clear(), setLockMode(), session.refresh()..)

    la je suis vraiment sec.. d'autant plus que ce pb apparait sur d'autres tables dans des circonstances bcp plus géantes (mise à jour de donnée via Ajax, qui du coup semblent ne pas marcher, alors que c'est hibernate qui ne recharge pas réellement les infos depuis la BDD), etc..


    Voici le bout de code en question, ainsi que le mapping hibernate correspondant.

    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
    Configuration c = new Configuration();
    c.setEntityResolver( new HbmEntityResolver());
    c.configure();
    _sessionFactory = c.buildSessionFactory();
    ...
    ...
    session = _sessionFactory.getCurrentSession();
    session.setFlushMode( FlushMode.ALWAYS);
    session.beginTransaction();
    session.setCacheMode(CacheMode.IGNORE);
    session.clear();
    ...
    ...
    Criteria criteria = session.createCriteria(VocalMessage.class);
    criteria
        .add(Restrictions.eq("id", a_vocalMessageId))
        .setLockMode(LockMode.READ);
    VocalMessage curRecord = (VocalMessage) criteria.uniqueResult();
    if(curRecord != null && !Utils.isEmpty(curRecord.getId())) {
          session.refresh(curRecord, LockMode.READ);
    }
    actionForm.setId(curRecord getCode());
    actionForm.setCode(curRecord getCode());
    actionForm.setName(curRecord getDescription());
    actionForm.setMessageId(curRecord getMessageIndex());
    ...
    ...
    session.getTransaction().commit();
    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
    62
    63
    64
    <hibernate-configuration>
      <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        <property name="default-cascade">persist</property>
     
        <!--second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    ...
    ...
    <hibernate-mapping  package="com.test.datamodel">
      <class
          name="VocalMessage"
          table="VOCAL_MESSAGE"
          abstract="false"
          dynamic-update="false"
          dynamic-insert="false"
          select-before-update="false"
          polymorphism="implicit"
          lazy="true">
        <id
          name="id"
          type="string"
          access="property"
          unsaved-value="null">
          <column
            name="ID"
            length="10"
          />
          <generator class="assigned"/>
        </id>
        <property
          name="name"
          type="string"
          access="property"
          update="true"
          insert="true"
          lazy="false">
          <column
            name="NAME"
            length="50"
            unique="false"
            not-null="true"
          />
        </property>
        <property
          name="messageId"
          type="string"
          access="property"
          update="true"
          insert="true"
          lazy="false">
          <column
            name="MESSAGEID"
            length="5"
            unique="true"
            not-null="true"
          />
        </property>
      </class>
    </hibernate-mapping>
      </session-factory>
    </hibernate-configuration>
    Si l'un de vous a une piste quelquonque je lui serait eternellement redevable ^__^


    Merci à tous pour votre aide.

    Patrick.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tout ce code vient de la même méthode ?

    Tu fermes ta session ou jamais ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Tout ce code vient de la même méthode ?
    Salut fr1man,
    Non mon code est eclaté en plusieurs methodes, j'ai fait ici une petite compilation pour simplifier l'ensemble...

    En fait je passe par un jar (dataModel qui gere le pool de connexions).
    De mon coté, je demande au dataModel une nouvelle connexion vi une methode getHibernateSession() :
    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
    	public static Session getHibernateSession() {
    		Session  session = null;
    		try {
    			session = Datamodel.getSessionFactory().getCurrentSession();
    			session.setFlushMode( FlushMode.ALWAYS);
    			session.beginTransaction();
    			session.setCacheMode(CacheMode.IGNORE);
    			session.clear();
    		}
     
    		catch(Throwable err) 
    		{
    			session = null;
    			MLogging.error(new LogData(null, MsgLabel.getLabel("error.bdd")));
    			MLogging.error(new LogData(null,err.getMessage()));
     
    			if(Configuration.isDEBUG()) { err.printStackTrace(); }
     
    		}
    		return session;
    Le dataModel lui fait appel a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Configuration c = new Configuration();
    c.setEntityResolver( new HbmEntityResolver());
    c.configure();
    _sessionFactory = c.buildSessionFactory();
    une fois que j'ai ma session, je travaille dessus (select/insert/update/commit selon les besoins). Les insert/update et chargement des objets sont localisés dans des méthodes spérarées. Je récupère à chaque fois la transaction en cours par un appel à une méthode getCurrentSession() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static Session getCurrentSession() {
    		Session  session = Datamodel.getSessionFactory().getCurrentSession();
    		if(!session.getTransaction().isActive()) {
    			session.setFlushMode( FlushMode.ALWAYS);
    			session.beginTransaction();
    			session.setCacheMode(CacheMode.IGNORE);
    			session.clear();
     
    		}
    		return session;
    	}

    et en fin d'action Struts, il y a toujours un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.getTransaction().commit();
    par contre, effectivement, mes sessions ne sont jamais explicitement fermées, car le pool de connexions hibernate est censé le faire tout seul.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    par contre, effectivement, mes sessions ne sont jamais explicitement fermées, car le pool de connexions hibernate est censé le faire tout seul.
    Ca dépend, tu l'as configuré comment ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Ca dépend, tu l'as configuré comment ?
    Je me suis un peu mélangé tout à l'heure...
    L'appel au SessionFactory().getCurrentSession() doit me retourner la session hibernate du thread courant ou en créer une si elle n'existe pas.
    A cette session est associée un connexion issue du pool de connexion BDD (qui sera géré a terme par Sequoia). Lors du commit(), la connexion est rendue au pool de connexion, et la session hibernate est terminée.

    Le pool de connexion sera géré à terme par sequoia (non actif sur la plateforme de dev)... du coup, je n'ai pas de paramétrage particulier pour mon poll de connexion.

    Voici le contenu de mon fichier hibernate.properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    hibernate.connection.url=jdbc\:mysql\://localhost/project?autoReconnect\=true
    hibernate.connection.username=xxx
    hibernate.connection.password=xxx
    hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
    hibernate.connection.autocommit=false
    hibernate.connection.release_mode=auto
    hibernate.show_sql=false
    ce que je ne comprend pas, c'est que même si la session hibernate m'était retournée à chaque fois etait la même,
    le fait de faire un session.setCacheMode(CacheMode.IGNORE) et un session.clear() après le beginTransaction() devrait suffire pour obliger hibernate à charger les données depuis la base de données, et non pas les récupérer dans un cache (que je n'ai pas activé..)

    non ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Effectivement, le clear devrait vider la session.

    Tu devrais cependant, fermer ta session après le commit de ta transaction.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Tu devrais cependant, fermer ta session après le commit de ta transaction.
    C'est fait, mais sans succès..
    Les pb de refresh apparaissent toujours.. peut être moins systématiquement qu'avant (en 1 fois sur 2, une fois sur 3) mais c'est assez subjectif..

    Il suffit que je charge une autre action Struts, pour revenir à ma page, et la elle se charge avec les bonnes données .. (alors que le refresh direct -ou le reload du navigateur- ne marche pas, ou alors aléatoirement)...

    Ca me fait vraiment penser à un pb de cache.. mais je ne vois pas ce que je peux faire de plus a ce niveau... (cache navigateur hors de cause)


    Je me demande si le pb ne pourrait pas être spécifique à Critéria...
    Se pourrait-il que le pb soit réglé en faisant ma requête de chargement de mon objet avec HQL ?

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Tu devrais cependant, fermer ta session après le commit de ta transaction.
    Si je ferme la session après le commit de la transaction, j'ai une exception :
    SessionException: Session was already closed
    qui est normale puisque le fait de faire un getSessionFactory().getCurrentSession() fermera la session à l'appel du commit()

    pour infos, on vient de passer la requête de chargement de l'objet en HQL, sans plus de succès.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    A mon avis, Hql ou Criteria, même combat.

    J'ai l'impression que tu fais des choses compliquées pour un problème simple, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     .setLockMode(LockMode.READ);
    ...
     session.refresh(curRecord, LockMode.READ);
    ...
    if(!session.getTransaction().isActive()) {
    			session.setFlushMode( FlushMode.ALWAYS);
    			session.beginTransaction();
    			session.setCacheMode(CacheMode.IGNORE);
    			session.clear();	
    }
    Tu n'as surement pas tout dit, mais tout ça me semble un peu inutile.
    Fais au plus simple.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    A moins de le specifier dans le hibernate.cfg.xml, la session n'est pas fermée d'elle même au commit.

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    A mon avis, Hql ou Criteria, même combat.

    J'ai l'impression que tu fais des choses compliquées pour un problème simple,
    ...
    Tu n'as surement pas tout dit, mais tout ça me semble un peu inutile.
    Fais au plus simple.
    Salut fr1man, et merci pour ton soutien.

    C'est sur,
    au départ je n'avait pas tout ca (setLockMode(), refresh(), .setFlushMode(), setCacheMode, clear()), mais face à ce pb de cache, j'ai essayé différents trucs censés palier mon pb... sans succès.

    Dans le code que je t'ai montré, j'ai tout laissé, histoire d'avoir un "historique" de ce qui à été essayé.

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par fr1man Voir le message
    A moins de le specifier dans le hibernate.cfg.xml, la session n'est pas fermée d'elle même au commit.
    Comment ca ? Ca veut donc dire que les sessions obtenues à partir du Factory ne sont pas automatiquement fermées par le commit() ?

    As tu un exemple de paramétrage a me montrer stp.

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Disons que j'ai pris pour habitude de fermer explicitement la session après le commit de la transaction, même si à priori (si j'ai bien compris la doc de la classe ThreadLocalSessionContext, ce n'est pas nécessaire quand on utilise la gestion contextuelle de session avec le paramétrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <property name="current_session_context_class">thread</property>
    Donc ton code hibernate semble correct.
    Est-ce que ça ne viendrait pas d'une utilisation de variables d'instances de Servlet, qui provoquerait la confusion.

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Salut fr1man,
    Je reste toujours sur mon pb...
    Je pense à faire une manip expéditive....
    l'idée serait de faire un evict explicitement sur chaque objet de la session, au debut de mon action Struts...

    J'ai bien trouvé comment supprimer tous les objets du SessionFactory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SessionFactoryImplementor sessionFactoryImpl = (SessionFactoryImplementor)p_hiberSession.getSessionFactory();
    // Every persistent class extends java.lang.Object, so the following call will return all persistent classes
    String[] persistentClasses = sessionFactoryImpl.getImplementors("java.lang.Object");
    for (String persistentClass : persistentClasses) {
    	System.out.println("Evict : "+persistentClass);
    	sessionFactoryImpl.evictEntity(persistentClass);
    }
    Mais cette solution ira supprimer tous les objets partages par toutes les sessions en cours (un peu trop expéditif). je voudrais me limiter à la session en cours, donc à travailler sur la classe Session au lieu de SessionFactory ; mais je n'arrive pas à récupérer tous les objets de la session courante

    As tu une idée pour les récupérer, afin de pouvoir faire un evict dessus ?

    Merci,
    Patrick.

  15. #15
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je prends le train en marche, mais il me vient une idée (idiote peut-être) :
    le client html utilise peut-être une page en cache...

    Tu es sûr qu'on n'est pas dans ce cas ou peux-tu le vérifier ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Je prends le train en marche, mais il me vient une idée (idiote peut-être) :
    le client html utilise peut-être une page en cache...

    Tu es sûr qu'on n'est pas dans ce cas ou peux-tu le vérifier ?

    A+
    Salut OButterlin,
    Effectivement, c'était ma toute première pensée..
    Je suis sous Firefox avec le plugin "web developer", grâce auquel je désactive le cache du navigateur (qui par ailleurs est également configuré pour ne pas être actif), et en plus, chaque page est générée avec les entêtes HTTP suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate"> 
    <meta http-equiv="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
    J'ai aussi fait ces tests sous ie en prenant soin de vider son cache manuellement à chaque test..

  17. #17
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu dis qu'à la fin de chaque action tu fais un commit, mais s'agit-il de la même session que celle utilisée pour la mise à jour ?
    Tu pourrais faire une sortie du hashCode aux 2 endroits pour être sûr ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu dis qu'à la fin de chaque action tu fais un commit, mais s'agit-il de la même session que celle utilisée pour la mise à jour ?
    Tu pourrais faire une sortie du hashCode aux 2 endroits pour être sûr ?
    Ce sont 2 sessions différentes...

    J'ai marqué un point d'arret sur la récupération de la session lors du save, et du load,
    voici ce que cela donne au debug (dsl pour la longueur )
    Lors du save :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    "session"= $Proxy0  (id=509)	
    	h= ThreadLocalSessionContext$TransactionProtectionWrapper  (id=510)	
    		realSession= SessionImpl  (id=512)	
    			actionQueue= ActionQueue  (id=517)	
    			autoClear= false	
    			autoCloseSessionEnabled= true	
    			cacheMode= CacheMode  (id=132)	
    				isGetEnabled= true	
    				isPutEnabled= true	
    				name= "NORMAL"	
    			childSessionsByEntityMode= null	
    			closed= false	
    			connectionReleaseMode= ConnectionReleaseMode  (id=137)	
    			dontFlushFromFind= 0	
    			enabledFilters= HashMap<K,V>  (id=514)	
    			entityMode= EntityMode  (id=147)	
    			factory= SessionFactoryImpl  (id=149)	
    			fetchProfile= null	
    			flushBeforeCompletionEnabled= true	
    			flushMode= FlushMode  (id=158)	
    				level= 10	
    				name= "AUTO"	
    			interceptor= EmptyInterceptor  (id=160)	
    			jdbcContext= JDBCContext  (id=515)	
    				connectionManager= ConnectionManager  (id=522)	
    				hibernateTransaction= JDBCTransaction  (id=521)	
    				isTransactionCallbackRegistered= true	
    				owner= SessionImpl  (id=512)	
    					actionQueue= ActionQueue  (id=517)	
    					autoClear= false	
    					autoCloseSessionEnabled= true	
    					cacheMode= CacheMode  (id=132)	
    					childSessionsByEntityMode= null	
    					closed= false	
    					connectionReleaseMode= ConnectionReleaseMode  (id=137)	
    					dontFlushFromFind= 0	
    					enabledFilters= HashMap<K,V>  (id=514)	
    					entityMode= EntityMode  (id=147)	
    					factory= SessionFactoryImpl  (id=149)	
    					fetchProfile= null	
    					flushBeforeCompletionEnabled= true	
    					flushMode= FlushMode  (id=158)	
    					interceptor= EmptyInterceptor  (id=160)	
    					jdbcContext= JDBCContext  (id=515)	
    					listeners= EventListeners  (id=166)	
    					persistenceContext= StatefulPersistenceContext  (id=516)	
    					rootSession= null	
    					timestamp= 11938414908	
    			listeners= EventListeners  (id=166)	
    				autoFlushEventListeners= AutoFlushEventListener[1]  (id=530)	
    				deleteEventListeners= DeleteEventListener[1]  (id=524)	
    				dirtyCheckEventListeners= DirtyCheckEventListener[1]  (id=527)	
    				evictEventListeners= EvictEventListener[1]  (id=533)	
    				flushEntityEventListeners= FlushEntityEventListener[1]  (id=536)	
    				flushEventListeners= FlushEventListener[1]  (id=539)	
    				initializeCollectionEventListeners= InitializeCollectionEventListener[1]  (id=542)	
    				loadEventListeners= LoadEventListener[1]  (id=545)	
    				lockEventListeners= LockEventListener[1]  (id=548)	
    				mergeEventListeners= MergeEventListener[1]  (id=551)	
    				persistEventListeners= PersistEventListener[1]  (id=554)	
    				persistOnFlushEventListeners= PersistEventListener[1]  (id=557)	
    				postCommitDeleteEventListeners= PostDeleteEventListener[0]  (id=558)	
    				postCommitInsertEventListeners= PostInsertEventListener[0]  (id=561)	
    				postCommitUpdateEventListeners= PostUpdateEventListener[0]  (id=564)	
    				postDeleteEventListeners= PostDeleteEventListener[0]  (id=567)	
    				postInsertEventListeners= PostInsertEventListener[0]  (id=568)	
    				postLoadEventListeners= PostLoadEventListener[1]  (id=569)	
    				postUpdateEventListeners= PostUpdateEventListener[0]  (id=572)	
    				preDeleteEventListeners= PreDeleteEventListener[0]  (id=573)	
    				preInsertEventListeners= PreInsertEventListener[0]  (id=576)	
    				preLoadEventListeners= PreLoadEventListener[1]  (id=579)	
    				preUpdateEventListeners= PreUpdateEventListener[0]  (id=582)	
    				refreshEventListeners= RefreshEventListener[1]  (id=585)	
    				replicateEventListeners= ReplicateEventListener[1]  (id=588)	
    				saveEventListeners= SaveOrUpdateEventListener[1]  (id=599)	
    				saveOrUpdateCopyEventListeners= MergeEventListener[1]  (id=602)	
    				saveOrUpdateEventListeners= SaveOrUpdateEventListener[1]  (id=603)	
    				updateEventListeners= SaveOrUpdateEventListener[1]  (id=604)	
    			persistenceContext= StatefulPersistenceContext  (id=516)	
    			rootSession= null	
    			timestamp= 11938414908	
    		this$0= ThreadLocalSessionContext  (id=124)	
    			factory= SessionFactoryImpl  (id=149)	
    				allCacheRegions= HashMap<K,V>  (id=181)	
    				classMetadata= Collections$UnmodifiableMap<K,V>  (id=176)	
    				collectionMetadata= Collections$UnmodifiableMap<K,V>  (id=178)	
    				collectionPersisters= HashMap<K,V>  (id=179)	
    				collectionRolesByEntityParticipant= Collections$UnmodifiableMap<K,V>  (id=180)	
    				currentSessionContext= ThreadLocalSessionContext  (id=124)	
    				entityNotFoundDelegate= SessionFactoryImpl$1  (id=182)	
    				entityPersisters= HashMap<K,V>  (id=185)	
    				eventListeners= EventListeners  (id=166)	
    				filters= HashMap<K,V>  (id=186)	
    				identifierGenerators= HashMap<K,V>  (id=187)	
    				imports= HashMap<K,V>  (id=188)	
    				interceptor= EmptyInterceptor  (id=160)	
    				isClosed= false	
    				name= null	
    				namedQueries= HashMap<K,V>  (id=189)	
    				namedSqlQueries= HashMap<K,V>  (id=190)	
    				properties= Properties  (id=191)	
    				queryCache= null	
    				queryCaches= null	
    				queryPlanCache= QueryPlanCache  (id=195)	
    				schemaExport= null	
    				settings= Settings  (id=197)	
    				sqlFunctionRegistry= SQLFunctionRegistry  (id=199)	
    				sqlResultSetMappings= HashMap<K,V>  (id=201)	
    				statistics= StatisticsImpl  (id=202)	
    				transactionManager= null	
    				updateTimestampsCache= null	
    				uuid= "4028964315f670810115f67086cf0000"	
    		wrappedSession= $Proxy0  (id=509)	
    			h= ThreadLocalSessionContext$TransactionProtectionWrapper  (id=510)	
    				realSession= SessionImpl  (id=512)	
    				this$0= ThreadLocalSessionContext  (id=124)	
    				wrappedSession= $Proxy0  (id=509)
    Lors du load :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    "session"= $Proxy0  (id=605)	
    	h= ThreadLocalSessionContext$TransactionProtectionWrapper  (id=606)	
    		realSession= SessionImpl  (id=608)	
    			actionQueue= ActionQueue  (id=613)	
    			autoClear= false	
    			autoCloseSessionEnabled= true	
    			cacheMode= CacheMode  (id=132)	
    			childSessionsByEntityMode= null	
    			closed= false	
    			connectionReleaseMode= ConnectionReleaseMode  (id=137)	
    			dontFlushFromFind= 0	
    			enabledFilters= HashMap<K,V>  (id=610)	
    			entityMode= EntityMode  (id=147)	
    			factory= SessionFactoryImpl  (id=149)	
    			fetchProfile= null	
    			flushBeforeCompletionEnabled= true	
    			flushMode= FlushMode  (id=158)	
    				level= 10	
    				name= "AUTO"	
    			interceptor= EmptyInterceptor  (id=160)	
    			jdbcContext= JDBCContext  (id=611)	
    				connectionManager= ConnectionManager  (id=617)	
    				hibernateTransaction= JDBCTransaction  (id=616)	
    				isTransactionCallbackRegistered= true	
    				owner= SessionImpl  (id=608)	
    					actionQueue= ActionQueue  (id=613)	
    					autoClear= false	
    					autoCloseSessionEnabled= true	
    					cacheMode= CacheMode  (id=132)	
    					childSessionsByEntityMode= null	
    					closed= false	
    					connectionReleaseMode= ConnectionReleaseMode  (id=137)	
    					dontFlushFromFind= 0	
    					enabledFilters= HashMap<K,V>  (id=610)	
    					entityMode= EntityMode  (id=147)	
    					factory= SessionFactoryImpl  (id=149)	
    					fetchProfile= null	
    					flushBeforeCompletionEnabled= true	
    					flushMode= FlushMode  (id=158)	
    					interceptor= EmptyInterceptor  (id=160)	
    					jdbcContext= JDBCContext  (id=611)	
    					listeners= EventListeners  (id=166)	
    					persistenceContext= StatefulPersistenceContext  (id=612)	
    					rootSession= null	
    					timestamp= 11938415733	
    			listeners= EventListeners  (id=166)	
    			persistenceContext= StatefulPersistenceContext  (id=612)	
    			rootSession= null	
    			timestamp= 11938415733	
    		this$0= ThreadLocalSessionContext  (id=124)	
    			factory= SessionFactoryImpl  (id=149)	
    				allCacheRegions= HashMap<K,V>  (id=181)	
    				classMetadata= Collections$UnmodifiableMap<K,V>  (id=176)	
    				collectionMetadata= Collections$UnmodifiableMap<K,V>  (id=178)	
    				collectionPersisters= HashMap<K,V>  (id=179)	
    				collectionRolesByEntityParticipant= Collections$UnmodifiableMap<K,V>  (id=180)	
    				currentSessionContext= ThreadLocalSessionContext  (id=124)	
    				entityNotFoundDelegate= SessionFactoryImpl$1  (id=182)	
    				entityPersisters= HashMap<K,V>  (id=185)	
    				eventListeners= EventListeners  (id=166)	
    				filters= HashMap<K,V>  (id=186)	
    				identifierGenerators= HashMap<K,V>  (id=187)	
    				imports= HashMap<K,V>  (id=188)	
    				interceptor= EmptyInterceptor  (id=160)	
    				isClosed= false	
    				name= null	
    				namedQueries= HashMap<K,V>  (id=189)	
    				namedSqlQueries= HashMap<K,V>  (id=190)	
    				properties= Properties  (id=191)	
    				queryCache= null	
    				queryCaches= null	
    				queryPlanCache= QueryPlanCache  (id=195)	
    				schemaExport= null	
    				settings= Settings  (id=197)	
    				sqlFunctionRegistry= SQLFunctionRegistry  (id=199)	
    				sqlResultSetMappings= HashMap<K,V>  (id=201)	
    				statistics= StatisticsImpl  (id=202)	
    				transactionManager= null	
    				updateTimestampsCache= null	
    				uuid= "4028964315f670810115f67086cf0000"	
    		wrappedSession= $Proxy0  (id=605)	
    			h= ThreadLocalSessionContext$TransactionProtectionWrapper  (id=606)	
    				realSession= SessionImpl  (id=608)	
    				this$0= ThreadLocalSessionContext  (id=124)	
    				wrappedSession= $Proxy0  (id=605)

  19. #19
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    C'était plutôt entre session.update(...) ou session.save(...) et session.getTransaction().commit() que je te demandais de vérifier...

    Parce que si ce n'est pas la même session, rien ne dit que le commit est fait...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    chose étrange...
    L'algo utilisé est :

    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
    méthode struts saveAction()
      session = Datamodel.getSessionFactory().getCurrentSession();
      session.beginTransaction()
      save() // fait un insert ou update + commit
      session.beginTransaction()
      loadData() : fait un select simple avec l'id de l'objet a charger
      comit()
    fin methode
     
    méthode struts loadAction() 
      session = Datamodel.getSessionFactory().getCurrentSession();
      session.beginTransaction()
      loadData() : fait un select simple avec l'id de l'objet a charger
      comit()
    fin methode
    je remarque que lors de l'action saveAction, mon objet est toujours correctement affiché.., mon pb vient lorsque j'appelle une nouvelle action struts qui charge mon objet (ici loadAction())

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Empecher Lecture d'Enregistrement en cours de Modification
    Par toony dans le forum Administration
    Réponses: 4
    Dernier message: 09/12/2009, 11h18
  2. probleme de lecture après ecriture
    Par ing2009 dans le forum Réseau
    Réponses: 1
    Dernier message: 30/04/2009, 19h24
  3. Lecture et enregistrement photo et audio
    Par shakur221 dans le forum Java ME
    Réponses: 4
    Dernier message: 04/06/2008, 11h50
  4. Réponses: 18
    Dernier message: 17/01/2007, 12h49
  5. Valeur null lors de la lecture apres un insert
    Par omlip dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2006, 13h56

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