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 :

org.hibernate.StaleStateException: Batch update returned unexpected row count from up


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut org.hibernate.StaleStateException: Batch update returned unexpected row count from up
    Bonjour,
    J'ai l'exception suivante qui est déclenchée de temps en temps
    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
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
    	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
    	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
    	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    	at com.ulnet.memberarea.dao.OrderBook.DaoOrderBookImpl.updateTblTrade(DaoOrderBookImpl.java:905)
    	at com.ulnet.memberarea.service.OrderBook.ServiceOrderBookImpl.updateTblTrade(ServiceOrderBookImpl.java:450)
    	at com.ulnet.memberarea.OdiSysConnection.MonitoringLoader.updateTradeList(MonitoringLoader.java:1595)
    	at com.ulnet.memberarea.OdiSysConnection.MonitoringLoader.run(MonitoringLoader.java:523)
    L'exception est declenche quand j'essaye de commiter les modifications effectuees.
    L'exception est donc déclenchè au niveau de cette fonction :
    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
    public void updateTblTrade(Trade trade) {
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    		try {
    			session.beginTransaction();
    			Tbltrade t = generateTbltrade(trade);
    			if ( !isExist(t, session) ) {
    				session.save(t);
    				System.out.println("[Tbltrade Save]");
    			}
    			else {
    				session.merge(t);
    				System.out.println("[Tbtrade Merge]");
    			}
    			
    			session.getTransaction().commit();
    		}
    		catch(Exception e) {
    			session.beginTransaction().rollback();
    			e.printStackTrace();
    		}
    	}
    ici http://www.hibernate.org/hib_docs/v3...Exception.html ils disent quand ça arrive, mais pas comment y remédier.

    Qlq'un à déjà eu le même problème.

    Merci

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Un problème de versionning ne peut pas être géré automatiquement dans le cas général. Dans une application en mode TP, c'est l'utilisateur qui a fait des modifications sur des données, mais entre temps quelqu'un d'autre les à modifier. La solution consiste à prévenir l'utilisateur pour lui demander quoi faire : écraser les données ou afficher les nouvelles pour qu'il décide quoi faire.
    En mode batch, on peut considérer le processus suivant : on charge une liste d'objets indépendants à traiter, on applique les traitements puis on persiste. En cas d'erreur de version, une stratégie peut être de recommencer le traitement pour la donnée en erreur ==> recharger automatiquement la dernière version, la traiter et la persister.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    L'application que je développe est une application web, donc je peux être amener à avoir plusieurs threads d'execution.
    Dans le cas d'accès concurrents par exemple. Moi je voudrais écraser les données s'ils existent ! C'est pour ça que j'utilise le merge, au fait ni le update ni le saveorupdate ne marche dans mon cas, ça déclenche des exceptions de uniquekey ...

    A ton avis comment dois je proceder pour éviter ce genre d'exception (staleStateException).

    Meric

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    De mémoire, cette exception n'est lancée que lorsque tes objets définissent un attribut "version" qui sert justement à la gestion de version. Sans version, plus de StaleStateException je pense, et donc le dernier arrivé à toujours raison.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    J'utilise pas de versionning, toujours quand je recois des donnes soit je les insère soit j'update !!!

  6. #6
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    D'après la javadoc de l'exception :
    Thrown when a version number or timestamp check failed, indicating that the Session contained stale data (when using long transactions with versioning). Also occurs if we try delete or update a row that does not exist.

    Tu utilises peut être dans la même session deux instances d'objets différents, représentant la même ligne en BDD. Au moment du flush, hibernate ne saurait pas lequel des 2 objets prendre pour mettre à jour la BDD.

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    salut
    svp j ai un probleme avec sping batch je sais pas comment connaitre les batch spring suspendi avec spring batch .
    merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/08/2014, 11h26
  2. Réponses: 0
    Dernier message: 24/10/2008, 14h35
  3. Réponses: 1
    Dernier message: 10/10/2008, 10h39
  4. Réponses: 2
    Dernier message: 03/10/2008, 16h09
  5. org.hibernate.hql.ast.QuerySyntaxError: unexpected token
    Par oughlad dans le forum Hibernate
    Réponses: 9
    Dernier message: 26/05/2006, 14h20

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