解决在HibernateTemplate下进行junit测试时,无法增、删、改的问题
在dao实现类中继承了HibernateDaoSupport,使用HibernateTemplate进行增删改查操作,编写测试类测试时,
查询操作成功,其余均失败
报错:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL):
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
错误信息很好理解,就是不要在设置了只读的情况下进行增删改操作
检查spring配置文件,其中只对service包下进行事务管理,即没有对测试类进行事务管理
在这种情况下(其他情况:如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配上),
spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就是不被允许的
在测试方法上,添加@Transactional(readOnly=false)注解,设置为可写
这样的话,程序不再报错,提示许多信息,然后就没有然后了。。。
在提示信息的最后一行,发现:
Rolled back transaction for test context
可以通过在dao实现类方法中使用:this.getHibernateTemplate().flush();
控制台可以打印相关sql语句
由此,判断事务是自动回滚了
所以使用JUnit 测试hibernate 事务管理的时候应注意 ,测试类完成是默认回滚的
由于在hibernate中不想设置自动提交事务,HibernateTemplate中也没有提供提交事务的方法
使用注解提交, @Rollback(false)
所以,只需在测试方法上加上下面三个注解
@Test
@Transactional(readOnly=false)
@Rollback(false)
就可以进行测试了,而不需要改动任何配置文件。