views:

64

answers:

1

I'm running a test within a subclass of AbstractTransactionalTestNGSpringContextTests, where I execute tests over a partial Spring context. Each test runs within a transaction, which is rolled back at the end to leave the database unchanged.

One test writes to the database through Hibernate, while another reads from the same database using the JdbcTemplate, with both share the same datasource.

I'm finding that I can't see the hibernate updates when querying through the JdbcTemplate. This does make some sense, as each is presumably getting its own connection from the connection pool and so is operating within its own transaction.

I've seen indications that it's possible to get the two to share a connection & transaction, but am not clear of the best way to set this up, especially with the involvement of the connection factory. All these components are declared as Spring beans. Can anyone give me any pointers?

Edit:

Well I've gone to the trouble of actually reading some documentation and the HibernateTransactionManager class states that this is definitely possible: "This transaction manager is appropriate for applications that use a single Hibernate SessionFactory for transactional data access, but it also supports direct DataSource access within a transaction (i.e. plain JDBC code working with the same DataSource)...".

The only requirement appears to be setting the datasource property, which isn't otherwise required. Having done that, though, I'm still not seeing my changes shared before the transaction has been committed. I will update if I get it working.

A: 

The Spring bean that writes has to flush its changes in order for the bean that reads to see them.

duffymo
Thanks - I was flushing after the save already (sessionFactory.getCurrentSession().saveOrUpdate(instance); sessionFactory.getCurrentSession().flush();). That doesn't work. I assume you think it should work, then?
Martin Dow