Bonjour,

j'ai des DAO qui utilisent des HibernateTemplate et JDBCTemplate.
Si je suis dans une transaction, j'ai constaté qu'avant de faire une query via le JDBCTemplate il fallait absolument que je fasse un appel à HibernateTemplate.flush() pour que celui-ci ait connaissance des éventuels mises à jour faites par mon HibernateTemplate sur mes données.

Exemple:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
hibernateTemplate.save(unObject);
.....
hibernateTemplate.flush();
List<String> childrenIds = (List<String>) jdbcTemplate.queryForList(SQLQuery.FIND_OBJECT_LIST,
				params, java.lang.String.class);
Dans ce cas si je ne fais pas un flush() avant de faire appel à queryList(), l'objet préalablement persisté via la méthode save() ne sera pas retourné dans la liste.

Voici comment les templates sont créés dans mes DAO:

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
 
public class WorkflowObjectDAO {
 
	private HibernateTemplate hibernateTemplate = null;
	private JdbcTemplate jdbcTemplate = null;
 
	public void setDatasource(DataSource ds) {
		jdbcTemplate = new JdbcTemplate(ds);
	}
 
	public void setSessionFactory(SessionFactory sessionFactory) {
		hibernateTemplate = new HibernateTemplate(sessionFactory);
	}
 
	...
 
}
Et voici la définition des beans:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
<bean id="jurDatasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton">
   <property name="driverClassName" value="${jdbc.driverClassName}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
</bean>
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
 
<bean id="hibernateSessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" scope="singleton">
    <property name="dataSource" ref="jurDatasource" />
    <property name="mappingResources">
      <list>
        <value>config/hibernate/WorkflowObject.hbm.xml</value>
        ...
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">
          org.hibernate.dialect.OracleDialect
        </prop>
      </props>
    </property>
</bean>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory" ref="hibernateSessionFactory" />
   	</bean>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
<bean id="WorkflowObject.DAO" class="lu.ic.common.component.dao.WorkflowObjectDAO">
   <property name="sessionFactory" ref="hibernateSessionFactory"/>
   <property name="datasource" ref="jurDatasource"/>		
</bean>

Y'a-t-il moyen de configurer Spring de façon à ce que mon jdbcTemplate ai connaissance des éventuelles mises à jour de mes données sans que je sois obligé de manuellement faire un flush() à chaque fois ?

Merci d'avance pour toute aide