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 :

Transaction, execution a posteriori ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut Transaction, execution a posteriori ?
    Bonjour,

    je realise un ensemble de traitement par paquet avec Hibernate.
    Basiquement ce sont 2 updates et/ou 2 ajouts dans 2 tables differentes dont voici le code :

    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
    	public void insert(FluxTasca fluxtasca) throws PersistenceServiceException{
    		fluxtasca.setTxsequencia(fluxtasca.getTxsequencia() + 1);
    		String hqlUpdateTasques="update from net.gencat.uid.model.param.flux.FluxTasca " +
    			" set txsequencia=txsequencia + 1" +
    			" where txsys='" + Constantes.getTipusSystem() + "' " +
    			" and flcodi='" + fluxtasca.getFlcodi() + "'" +
    			" and flservei='" + fluxtasca.getFlservei() + "'" +
    			" and txsequencia >= " + fluxtasca.getTxsequencia() +
    			" order by txsequencia desc";
    		String hqlUpdatePred="update from net.gencat.uid.model.param.flux.Predecessor " +
    			" set prsequencia=prsequencia + 1" +
    			" , pranterior=pranterior +1 " +
    			" where prsys='" + Constantes.getTipusSystem() + "' " +
    			" and flcodi='" + fluxtasca.getFlcodi() + "'" +
    			" and flservei='" + fluxtasca.getFlservei() + "'" +
    			" and prsequencia >= " + fluxtasca.getTxsequencia() +
    			" order by txsequencia desc";
    
    		Transaction tx = dao.getHibernateSession().beginTransaction();
    		try{
    			dao.getHibernateSession().createQuery(hqlUpdateTasques).executeUpdate();
    			dao.getHibernateSession().createQuery(hqlUpdatePred).executeUpdate();
    			if (!getTascaFromFlux(fluxtasca.getFlcodi(),fluxtasca.getFlservei()).isEmpty()){
    				if (fluxtasca.getTxsequencia()==1){
    					getPredBO().save(fluxtasca.getFlcodi(),fluxtasca.getFlservei(),fluxtasca.getTxsequencia()+1,fluxtasca.getTxsequencia());
    				}else{
    					getPredBO().save(fluxtasca,fluxtasca.getTxsequencia()-1);
    				}
    			}
    			save(fluxtasca); 
    			tx.commit();
    		}catch (HibernateSystemException e){
    			tx.rollback();
    		}
    	}
    Les lignes en rouge ne se rien de plus que des appels de type Session.save(...), et peuvent etre consideres comme des ajouts d'enregistrement dans la base de données.
    ce code fonctionne très bien. sauf qu'en cas d'erreur dans une des instructions save, j'ai peur que cette erreur puisse se déclencher plus tard et donc hors de mon try catch.
    En tout cas, ce que j'ai constaté en utilisant le debogueur, c'est que lors du commit(), seulement les deux premieres instructions sont executées en base de données, alors que les suivantes le sont seulement quand on sort de la methode insert.
    Etrange non? Y'a t-il quelque chose que je n'ai pas compris avec Hibernate ?

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Salut willoi,

    Donc pour ton probleme je n'ai pas tout capté.

    Tu dit qu'Hibernate te fait les insert après etre sorti de ta methode?
    Plutot surprenant sachant que le commit valide tes insert et si jamais il ne sont pas correcte fait un roolback sur la transaction (code dans le catch).


    Le seul truc qui serait possible est que tu as commencer une transaction sur une autre session sur laquelle tu fais tes operations et lorsque tu commit tu ne commit pas la "bonne" transaction et donc tes modifications sont faites que lorsque cette session (la ou tu as fait tes modifs) soit committer.

    Oulalala j'espere que j'ai pas trop fait de chinois, surtout que c'est juste une supposition car dur de trouver le probleme precisement comme ca.

  3. #3
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Salut maxf1,

    A priori je dirais qu'il n'y'a pas de transaction sur une autre session.
    En tous ca pas que je sache
    En fait j'ai un doute juste sur le fait que une fois le commit lancé, et bien Hibernate n'écrive pas les nouveaux enregistrements dans la base donnees tout de suite !
    En fait, c'est ce que constate en deboguant.
    Si je suis positionné sur la derniere accolade, et que je vais voir le contenu de la bdd, les updates sont effectués mais pas les inserts.
    si je poursuis l'execution, y'a tout un tas de truc qui se lance et finalement les inserts se font bien!!!!

    Je vais tenter de le faire planter volontairement, on va bien voir ce qui se passe !

  4. #4
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Oui tu peux toujours tester en le faisant planter. C'est tout de meme bizarre, je n'ai jamais regarder de tel comportement chez moi peut-etre une "non attention" peut expliquer cela, ou bien alors cela vient du faite d'inserer ou d'updater via du HQL!

  5. #5
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Bon, en le faisant planter, cela me lance une HibernateSystemException mais il semblerait qu'elle soit interceptee dans un autre endroit et du coup tx.rollback()
    ne s'execute jamais !!!!
    En fait par rapport a ma question c'est resolu, mais ca en souleve une autre :
    Existe-y-il des mecanismes d'interception d'exception qui font que une exception ne passe pas a travers un catch?
    J'avoue, je suis un peu perdu.
    Voici la trace de l'erreur, (et c'est normal qu'elle se produise, je l'ai volontairement declenche pour le test en creant un enregistrement evc une primary key qui existe deja) :
    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
    net.opentrends.openframe.services.persistence.exception.PersistenceServiceException: org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [net.gencat.uid.model.param.flux.FluxTasca#net.gencat.uid.model.param.flux.FluxTasca@1746634]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [net.gencat.uid.model.param.flux.FluxTasca#net.gencat.uid.model.param.flux.FluxTasca@1746634]
    	at net.opentrends.openframe.services.persistence.spring.dao.impl.SpringDAOImpl.save(SpringDAOImpl.java:676)
    	at net.gencat.uid.model.param.flux.FluxTascaBO.save(FluxTascaBO.java:59)
    	at net.gencat.uid.model.param.flux.FluxTascaBO.insert(FluxTascaBO.java:48)
    	at net.gencat.uid.model.param.flux.FluxTascaBO$$FastClassByCGLIB$$82df729e.invoke(<generated>)
    	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:698)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
    	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
    	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:643)
    	at net.gencat.uid.model.param.flux.FluxTascaBO$$EnhancerByCGLIB$$e7da4e8b.insert(<generated>)
    	at net.gencat.uid.struts.action.param.FluxTascaAction.savenew(FluxTascaAction.java:50)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
    	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
    	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    	at net.opentrends.openframe.services.web.struts.ExtendedDelegatingTilesRequestProcessor.processActionPerform(ExtendedDelegatingTilesRequestProcessor.java:374)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:163)
    	at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:139)
    	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392)
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    	at org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)
    	at net.opentrends.openframe.services.web.filter.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:357)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at net.opentrends.openframe.services.web.i18n.JSTLLocaleFilter.doFilter(JSTLLocaleFilter.java:116)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at net.opentrends.openframe.services.web.i18n.StrutsLocaleFilter.doFilter(StrutsLocaleFilter.java:70)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at net.opentrends.openframe.services.logging.RequestLoggingFilter.doFilter(RequestLoggingFilter.java:78)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
    	at net.opentrends.openframe.services.security.filter.RefererRequiredFilter.doFilter(RefererRequiredFilter.java:118)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at net.opentrends.openframe.services.security.filter.ApplicationClosedFilter.doFilter(ApplicationClosedFilter.java:96)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
    	at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:216)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:108)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:195)
    	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
    	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
    	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:90)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    	at java.lang.Thread.run(Thread.java:595)
    Caused by: org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [net.gencat.uid.model.param.flux.FluxTasca#net.gencat.uid.model.param.flux.FluxTasca@1746634]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [net.gencat.uid.model.param.flux.FluxTasca#net.gencat.uid.model.param.flux.FluxTasca@1746634]
    	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660)
    	at net.opentrends.openframe.services.persistence.spring.dao.impl.SpringDAOImpl.save(SpringDAOImpl.java:677)
    	... 96 more
    Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [net.gencat.uid.model.param.flux.FluxTasca#net.gencat.uid.model.param.flux.FluxTasca@1746634]
    	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:144)
    	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
    	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
    	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
    	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:481)
    	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:476)
    	at net.opentrends.openframe.services.persistence.spring.dao.impl.SpringDAOImpl.save(SpringDAOImpl.java:674)
    	... 96 more

  6. #6
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    J'ai pas lu profondément, mais juste après un Save() il est recommandé de faire un session.Flush() car sinon, effectivement, le Save() ne touche à la bdd de suite.

  7. #7
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Ton cas m'intrigue la. Ta essayer un cas tout simple (classe de test) hors de ton appli qui ferait le meme traitement?

    Pour repondre à ta question oui je crois qu'il existe des classes d'interception mais je ne me suis jamais penché énormément sur le sujet...

  8. #8
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Citation Envoyé par willoi
    Les lignes en rouge ne se rien de plus que des appels de type Session.save(...), et peuvent etre consideres comme des ajouts d'enregistrement dans la base de données.
    S'il n'y a bien QUE Save() dans "les lignes en rouge", il faut leur ajouter un Flush() pour ça soulève de suite une exception au besoin.

    Citation Envoyé par maxf1
    Le commit sur une transaction ne fait-il pas un flush s'il n'y en a pas?
    Si si, le commit() flush avant si nécessaire.

  9. #9
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Bon alors voila.
    Quand une erreur se produit lors du save(...), celle-ci lance une PersistenceServiceException.
    Cette exception herite de Exception et semble etre definie quelque part dans mon framework(qui est base sur Spring).
    Avec ca je suis pas tellement plus avancé.
    Donc un peu plus loin de le code, dans un catch j'attrape cette exception et fait un rollback, mais apres le catch, il semblerait que Hibernate tente encore d'executer quelque chose et se produit l'erreur org.springframework.dao.DataIntegrityViolationException

    Donc il semble que cela se fasse en 2 temps!!??!!

    Peut etre faudrait-il que fasse ce fameux flush(), mais si l'erreur se produit ce flush() ne peut plus etre atteint.
    Ou alors faut-il detruire la transaction?

  10. #10
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Citation Envoyé par willoi
    Bon alors voila.
    Quand une erreur se produit lors du save(...), celle-ci lance une PersistenceServiceException.
    Cette exception herite de Exception et semble etre definie quelque part dans mon framework(qui est base sur Spring).

    Ah j'ai failli te demander tout à l'heure si tu n'utilisais pas Spring par hasard, car je regarde Spring depuis le debut de semaine et j'arrivais justement sur la partie ou les exceptions étaient interceptés....

  11. #11
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Une solution pourrait consister a ecrire cet insert en hql et a priori le probleme serait reglé.
    Mais bon j'aimerais bien savoir pourquoi le Session.save() fait ca!!
    J'ai pas envie d'avoir de mauvaises surprises lors de la mise en production!

    Des fois je regrette le temps ou on faisait tout en sql, et on controlait tout soi-meme

  12. #12
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Juste comme ca d'ou tu peche ton

    tu l'as defini dans ta classe? Ta classe implément ou extends qu'elle classe?

    tu ne devrais pas faire ca plutot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dao.getHibernateSession().save(fluxtasca)

  13. #13
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Citation Envoyé par neilbgr
    Si si, le commit() flush avant si nécessaire.

    Pourquoi alors dans son cas (d'après ce que tu dis, si j'ai bien tout compris) il ne le fait pas car il fait bien un commit sur la transaction?

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

Discussions similaires

  1. Probleme pendant l'execution d'une transaction
    Par javalhoussain dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/05/2011, 18h02
  2. API e-transactions CA - executable request non trouve
    Par cyberom dans le forum E-Commerce
    Réponses: 1
    Dernier message: 18/03/2010, 11h29
  3. [Transact-SQL] Problème avec "execute" dans un "if"
    Par dj_lil dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/12/2007, 15h56
  4. Dans même transaction : recordset et execute
    Par gerard101 dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/09/2007, 02h37
  5. [ADO] Requete qui ne s'execute pas dans une transaction
    Par Faboul dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/07/2007, 13h30

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