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

  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 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
    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.
    Le commit sur une transaction ne fait-il pas un flush s'il n'y en a pas?

  9. #9
    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.

  10. #10
    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?

  11. #11
    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?

  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
    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....

  13. #13
    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

  14. #14
    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)

  15. #15
    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
    Voila le code de save() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private DAO dao;
    public void save(FluxTasca fluxtasca) throws PersistenceServiceException{
    		fluxtasca.setTxsys(Constantes.getTipusSystem());
    		fluxtasca.setTxdataalta(new Date());
    		fluxtasca.setTxdataedicio(new Date());
    		fluxtasca.setTxusuari(securityService.getUserLogin().getUserName());
    		dao.save(fluxtasca);
    	}
    la classe DAO (je l'ai vu en decompilant), utilise Session pour faire save load get etc ..

  16. #16
    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
    et quand tu fait dao.save(), le dao fait aussi appel à getHibernateSession? ou elle en prend/crée une autre?

  17. #17
    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
    Voila je viens de decompiler la classe de ce putain de !%·/·"( de framework de mes .
    Cette classe etends HibernateDaoSupport qui fait partie de Spring. Et permet de revenir à des choses plus "normales".
    Et j'ai trouvé la méthode save()
    getSession() retourne la session Hibernate.
    Donc manifestement cette methode ne fait rien de plus que dao.getHibernateSession().save(fluxtasca)

    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 Serializable save(Object obj)
            throws PersistenceServiceException
        {
            try
            {
                return getSession().save(obj);
            }
            catch(HibernateException ex)
            {
                throw new PersistenceServiceException(SessionFactoryUtils.convertHibernateAccessException(ex), net.opentrends.openframe.services.persistence.exception.PersistenceServiceException.class.getPackage().getName() + ".cannot_save", new Object[] {
                    obj
                }, Layer.SERVICES, Subsystem.PERSISTENCE_SERVICES);
            }
            catch(DataAccessException ex)
            {
                throw new PersistenceServiceException(ex, net.opentrends.openframe.services.persistence.exception.PersistenceServiceException.class.getPackage().getName() + ".cannot_save", new Object[] {
                    obj
                }, Layer.SERVICES, Subsystem.PERSISTENCE_SERVICES);
            }
        }

  18. #18
    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
    Malheureusement j'ai bien peur que ca soit légèrement plus compliqué.

    N'ayant pas toutes les billes pour confirmer ce que je pense a savoir que c'est surement une session ouverte (avec la transaction) bien avant que celle que tu utilises toi pour faire ton update, et donc cette transaction est géré tout seul via Spring et c'est pour cela que lorsque tu fais un commit le commit ne fait seuleument ce que tu lui a modifier sur ta session.
    Ensuite l'insert sera fait lorsque Spring fera le commit sur cette transaction.

    A stu essayer ce que je proposais, juste pour tester et essayer de vérifier/ou contredire mes dires :

    Modifie ta methode save comem ceci, la au moins on est sur que c'est sur la meme session et transaction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void save(FluxTasca fluxtasca) throws PersistenceServiceException{
    		fluxtasca.setTxsys(Constantes.getTipusSystem());
    		fluxtasca.setTxdataalta(new Date());
    		fluxtasca.setTxdataedicio(new Date());
    		fluxtasca.setTxusuari(securityService.getUserLogin().getUserName());
    		dao.getHibernateSession().save(fluxtasca);
    	}
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void save(FluxTasca fluxtasca) throws PersistenceServiceException{
    		fluxtasca.setTxsys(Constantes.getTipusSystem());
    		fluxtasca.setTxdataalta(new Date());
    		fluxtasca.setTxdataedicio(new Date());
    		fluxtasca.setTxusuari(securityService.getUserLogin().getUserName());
    getPredBO.save(fluxtasca);
    }
    Etant donnée que tu es sur le forum Hibernate, peut-etre devrais-tu demander à un admin de bouger ton post dans la partie Spring pour essayer d'avoir des avis de vrai "Springeur"

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Une petite précision, ton save de doit s'appliquer que sur des objets qui ne sont pas déjà en base, sinon il ne sert à rien. (je dis ça juste au cas où)

    Ensuite, comme cela a été dit plus haut, il faut vérifier que tes transactions ne soient pas gérées par spring, en examinant les fichiers de config de Spring.
    Si c'est le cas, pas besoin de faire des transaction.begin(), rollback() dans ton code.

    Pour finir, je ne vois pas l'intérêt de faire un flush après le save comme cela a été dit.

  20. #20
    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
    Citation Envoyé par fr1man
    Une petite précision, ton save de doit s'appliquer que sur des objets qui ne sont pas déjà en base, sinon il ne sert à rien. (je dis ça juste au cas où)

    Ensuite, comme cela a été dit plus haut, il faut vérifier que tes transactions ne soient pas gérées par spring, en examinant les fichiers de config de Spring.
    Si c'est le cas, pas besoin de faire des transaction.begin(), rollback() dans ton code.

    Pour finir, je ne vois pas l'intérêt de faire un flush après le save comme cela a été dit.
    Bon ok je vois, je ne sais pas trop comment le verifier dans Spring, mais je suis quasi sur les transaction ssont gerees par Spring.
    Mais bon si c'est le cas, et que je ne dois pas faire de begin() ni de rollnback(), si je veux executer, un groupe de requetes "ensembles", et si l'une d'entre elles plante, je veux qu'aucun changement ne soit fait dans la base de données, comment dois-je procéder ?

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

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