HIbernate:当所有交易正确提交时,“不支持嵌套交易”

时间:2015-07-14 04:18:26

标签: java hibernate exception transactions

我已阅读有关此主题的一些帖子:例如,herehere

就我而言,我确信所有事务都已提交,并且所有异常都是通过回滚来处理的。

目前,我正在为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的副作用。尽管如此,我在单元测试中使用变通方法感到很不舒服。如果程序员不知道其背后的问题原因,那么修复是不安全的。

有人可以就异常的可能原因提出建议吗?

1 个答案:

答案 0 :(得分:0)

答案是与junit相关,而不是与hibernate相关。

似乎junit中的assert语句将退出一个方法,因此如果assert语句在提交之前,则提交不会发生。

这无疑是junit中的初学者错误,但可能对其他初学者有用。