最近在项目中用到Spring 2.5 + Hibernate 3.2,在做事务处理的过程中用到了自身嵌套的事务的问题,使用声明式的事务处理无法解决该问题,查看Spring 2.5的文档《9.5.6. 使用 @Transactional》一节中看到:
于是使用@Transactional来做,在Spring 配置xml文件里使用以下配置
但是用测试用例测试时会抛出如下异常:
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
测试用例如下:
public class ManagerTest extends
AbstractDependencyInjectionSpringContextTests {
private Manager manager;
public void setCategoryManager(Manager manager) {
this.manager= manager;
}
@Override
protected String[] getConfigLocations() {
return new String[] { "classpath:applicationContext.xml" };
}
public void testAdd() {
Entity entity = new Entity();
entity.setId("1314");
entity.setName("测试异常事务");
try {
manager.addOrUpdate(Entity);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
重写测试用例如下:
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class CateManagerTest extends
AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private Manager manager;
@Test
public void testAdd() {
Entity entity = new Entity();
entity.setId("1314");
entity.setName("测试异常事务");
try {
manager.addOrUpdate(Entity);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行不再抛出异常,但是hibernate在控制台只提交查询的select语句,却不做插入数据库的操作
有哪位大侠高手用过@Transactional + AspectJ 形式的事务处理请告诉我该如何使用AspectJ做事务处理,谢谢了。
参考一篇文章了解
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/
这是因为 Spring 的在测试方法返回前进行了事务回滚操作。
楼主你的Spring配置好像就有问题:
[quote]
[/quote]
改为下边的:
[code="xml"]<!-- 配置事务管理器(针对hibernate的事务管理器) -->
<!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
[/code]