如何手动提交spring DAO层事务

anqier01 2009-08-27 11:17:14
如题所述,项目用sping进行事务控制的,但是目前单元测试DAO层的数据库操作时,不想用spring进行事务控制,想手动提交事务,该如何进行?
DAO层方法的代码如下:

public void removeOrUpdate(final String hql, final Object[] values,
final boolean t) throws DAOException {
try {
getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List<Integer> result = new ArrayList<Integer>();
Query query = session.getNamedQuery(hql);
if (values != null) {
for (int i = 0; i < values.length - 1; i++) {
query.setParameter(i, values[i]);
}
if (t)
query.setParameterList("ids",
(String[]) values[values.length - 1]);
else
query.setParameter(values.length - 1,
values[values.length - 1]);

}

result.add(query.executeUpdate());
return result;
//for test


}

});
} catch (Exception e) {
log.error("批量删除或更新对象出错");
throw new DAOException(e.getMessage());

}

}




单元测试的代码如下:

public void testRemoveOrUpdate() {
Transaction tx= baseDAO.getHibernateTemplate().getSessionFactory().getCurrentSession().beginTransaction();
tx.begin();
String hql = "UPDATE_CHECK_AND_LEVEL";
Date approveDate = new Date(System.currentTimeMillis());// 获取当前时间
Object[] values = { approveDate, "8aa2b2671eced198511ecedab3c10327" };
Boolean t=false;
baseDAO.removeOrUpdate(hql, values, t);
tx.commit();
}


在单元测试的方法中用baseDAO.getHibernateTemplate().getSessionFactory().getCurrentSession().beginTransaction()的currentSession报出“找不到当前线程的session”,就是不知道该如何调用到DAO的线程session,所以事务无法进行提交。用getSessionFactory().openSession()方法的话是新创建一个Session,与spring的getHibernateTemplate中的session不是同一个,所以也是无法提交事务。。。各位大虾有米有遇到类似的问题,,帮忙出谋划策下。。。。
...全文
789 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
anqier01 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 herowzz 的回复:]
Java code
getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException {//在这里用session提交事务 } });
[/Quote]



单元测试时并不想为了使单元测试成功,而通过改变DAO层的代码来实现,因为在正常的应用中,事务的处理已经有spring来完成了。。所以没必要在DAO层中进行手动事务提交。。
anqier01 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 archko 的回复:]
这两个显然不是一个session,肯定出错。
其实你的问题是不是可以转化为另一个>>你测试后可以把这个过程回滚?你不想在数据库里插入测试时用的数据?
这个可以用spring的测试框架,如果是的话,你网上查查,现在我没有找到,回去的话再找给你.
[/Quote]


我现在就是想测试时的数据要插入到数据库中,这样我才能从数据库中去验证dao层的removeOrUpdate()方法是否进行数据库操作正确,可是无论我怎么试都无法插入到数据库中,也就是说在单元测试的那个方法里事务都没有提交成功。。不知道该如何提交这个事务。。。
herowzz 2009-08-31
  • 打赏
  • 举报
回复
那请把你的单元测试贴完整
herowzz 2009-08-28
  • 打赏
  • 举报
回复

getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
//在这里用session提交事务 }
});
archko 2009-08-27
  • 打赏
  • 举报
回复
这两个显然不是一个session,肯定出错。
其实你的问题是不是可以转化为另一个>>你测试后可以把这个过程回滚?你不想在数据库里插入测试时用的数据?
这个可以用spring的测试框架,如果是的话,你网上查查,现在我没有找到,回去的话再找给你.
anqier01 2009-08-27
  • 打赏
  • 举报
回复
怎么没有人知道哦。。。偶自己顶下。。。

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧