就我而言,我确信所有事务都已提交,并且所有异常都是通过回滚来处理的。
目前,我正在为Web应用程序(Spring / Hibernate / Postgres)构建模型层。我正在使用junit来严格测试我的构建。出于某种原因,在一次删除测试中,我反复得到“不支持嵌套事务”异常。
Session session=HibernateDAO.getSessionFactory().getCurrentSession();
try
{
session.getTransaction().begin();
List<TestUnitType> result = session.createQuery("from TestUnitType").list();
TestUnitType itemToDelete = result.get(0);
session.delete(itemToDelete);
session.getTransaction().commit();
} catch (Exception e)
{
TestSS.getLogger().error(e.toString(), e);
session.getTransaction().rollback();
fail(e.toString());
}
在查询之前调用事务时抛出异常。之前的方法肯定会关闭事务,因为它使用与此方法相同的语法(并且我仔细调试过)。
我通过创建kludge方法并使用它来获取会话来解决问题:
public static Session resetCurrentSession()
{
Session oldsession = getSessionFactory().getCurrentSession();
if(oldsession.isOpen())
{
oldsession.close();
}
return getSessionFactory().getCurrentSession();
}
所有单元测试现在都运行并通过,数据库中的数据是干净的,我看不到我的kludge的副作用。尽管如此,我在单元测试中使用变通方法感到很不舒服。如果程序员不知道其背后的问题原因,那么修复是不安全的。
有人可以就异常的可能原因提出建议吗?
答案 0 :(得分:0)
答案是与junit相关,而不是与hibernate相关。
似乎junit中的assert语句将退出一个方法,因此如果assert语句在提交之前,则提交不会发生。
这无疑是junit中的初学者错误,但可能对其他初学者有用。