Le fonctionnement de la méthode flush()
Hello tout le monde, j'ai un peu de mal à voir comment fonctionne le flush sous hibernate car je suis confronté un problème.
Lorsque j'essaie de récupérer un objet de la base de donnée avec ce bout de code
Code:
1 2 3 4
| vContrat = (ContratVO) getSessionFlushAndClear()
.createCriteria(ContratVO.class)
.add(Restrictions.eq(ConstantesContrat.CNT_CODE,
pCodeContrat)).uniqueResult(); |
Sachant que la méthode getSessionFlushAndClear
Code:
1 2 3 4 5
| protected Session getSessionFlushAndClear() {
flush();
clear();
return getSession();
} |
J'ai cette erreur
Code:
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
| org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:675)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:881)
at com.edf.ftn.data.hibernate.BaseDAOHibernate.flush(BaseDAOHibernate.java:343)
at com.edf.ftn.data.hibernate.BaseDAOHibernate.getSessionFlushAndClear(BaseDAOHibernate.java:396)
at com.edf.ftn.data.dao.contrat.ContratDAO.getContratByCode(ContratDAO.java:855)
at com.edf.ftn.data.manager.facture.FactureManager.getContratFactureByCodeWithFlush(FactureManager.java:1415)
at com.edf.ftn.metier.domaine.facture.FactureBO.getContratFactureByCodeWithFlush(FactureBO.java:535)
at com.edf.ftn.metier.domaine.facture.workflow.echeancier.WorkflowEcheancier.generationAutomatiqueEcheancier(WorkflowEcheancier.java:156)
at com.edf.ftn.metier.domaine.facture.EcheancierBO.majEcheancierPourAvenantDateEffet(EcheancierBO.java:770)
at com.edf.ftn.metier.domaine.facture.EcheancierBO.majEcheancierPourAvenant(EcheancierBO.java:598)
at com.edf.ftn.metier.services.ServicesMetierImpl.majEcheancierPourAvenant(ServicesMetierImpl.java:3852)
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:592)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy169.majEcheancierPourAvenant(Unknown Source)
at com.edf.ftn.web.contrat.action.EnregistrerAvenantAction.execute(EnregistrerAvenantAction.java:299)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:113)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(Unknown Source)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.execute(Unknown Source)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
Caused by: 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.BatchingBatcher.addToBatch(BatchingBatcher.java:34)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2470)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2647)
at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
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.springframework.orm.hibernate3.HibernateTemplate$28.doInHibernate(HibernateTemplate.java:883)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
... 50 more |
J'ai peu être une piste mais avant de faire appel à cette méthode plus haut, je fais une recherche sur des données à supprimer puis j'appelle cette fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public boolean supprimerEcheancierById(final Integer pId) {
boolean vRetour = true;
try {
getHibernateTemplate()
.delete(getObject(
pClazz,
pId));
} catch (HibernateException vEx) {
LOGGER.error(vEx.getMessage(), vEx);
throw new FtnExceptionTechnique(vEx.getMessage(),
vEx);
}
return vRetour;
} |
Dans la console, je vois bien les requetes que fait hibernate
Code:
1 2 3 4 5 6
| Hibernate:
delete
from
FTN_ECHEANCIER_ECH
where
ECH_ID=? |
Pourtant ce sont 2 choses différentes. Je ne vois pas en quoi la suppression des données qui impactent une table puisse avoir des répercussions sur un select qui sélectionne uniquement des contrats.
Comment je peux résoudre cette erreur, svp et surtout pourquoi est ce que j'ai cette erreur ?
Merci à vous