如何使用Spring MVC在hibernate中将autocommit设置为false

时间:2012-05-28 03:10:11

标签: hibernate spring-mvc transactions set autocommit

我目前正在学习Spring + Hibernate的集成,到目前为止我正在使用它。但是我遇到了我不希望在进程结束时提交事务的情况,因为我只是想看到生成的sql stattement用于测试和调试目的。

我已经在我的hibernate属性中添加了false,但是它仍然无效。

如果使用Spring来处理hibernate事务,是否可以实现?因为在hibernate中使用传统事务,有可能,只是不要调用session.commit()方法,所有更新和插入都不会被保存;

目前我的服务层有这个代码:

@Transactional(propagation = Propagation.SUPPORTS,readOnly = true) 公共类EmployeeServiceImpl {

@Autowired
private EmployeeDao employeeDao

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void saveEmployee(Employee employee){

    // count the number of employee in the database
    int n  = employeeDao.getEmployeeCount();
    // lets say it should print 10 here
    System.out.println("number of employee before inserting : " + n);

    // insert to employee
    employeeDao.saveEmployee(employee);

    // then count the employee after inserting
    n  =  employeeDao.getEmployeeCount();

    // then it should print 11 here after inserting new employee
    System.out.println("number of employee after inserting : " + n);

/* Then Dont commit insert!!!
*/

}

}

Dao层代码:

public EmployeeDaoImpl implements EmployeeDao{

@Autowired
public void saveEmployee(Employee employee){

    sessionFactory.getCurrentSession.save(employee);

}

public int getEmployeeCount(){

    String count = sessionFactory.getCurrentSesion.createQuery("select count(emp.employeeId) from Employee emp")
    .list().get(0).toString;

return Integer.valueOf(count);
}

}

但是这里发生的事情是它确实提交了事务!但是我不想仅仅为了测试和调试而提交事务。

我也试过了  @Transactional(propagation = Propagation.SUPPORTS,readOnly = false) 代替 @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)

但这里发生的事情是它没有提交交易,但是员工的数量也没有增加。

所以,我期望在这里发生的是在插入员工表之前计算员工数量。然后插入员工表并再次计算员工数量,因此它将增加1.但在流程结束时,我不想提交该插入!

你有想法吗?

我会非常感谢任何帮助! 谢谢!

1 个答案:

答案 0 :(得分:0)

要进行测试,请使用Spring test framework。它为您处理自动事务回滚。如果你正在寻找别的东西,你将不得不更具体。你的问题虽然充满细节,却对你真正想做的事情含糊不清。你只需要使用像“test”和“debug”这样的词。这些词对不同的人来说意味着很多不同的东西。