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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
    protected  Session getSessionFlushAndClear() {
    	flush();
    	clear();
	 return getSession();
    }
J'ai cette erreur
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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