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:
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.
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);
Voici comment les templates sont créés dans mes DAO:
Et voici la définition des beans:
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); } ... }
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![]()
Partager