【问题标题】:HIbernate: "Nested Transactions not supported" when all transactions properly committedHIbernate:当所有事务都正确提交时,“不支持嵌套事务”
【发布时间】:2015-10-02 13:20:30
【问题描述】:

我已经阅读了一些关于这个主题的帖子:例如,here 和 here

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

目前,我正在为 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();
}

所有单元测试现在都运行并通过了,数据库中的数据是干净的,我没有看到我的杂乱无章的副作用。尽管如此,我对在单元测试中使用变通方法感到不舒服。如果程序员不知道问题背后的原因,那么任何修复都是安全的。

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

【问题讨论】:

  • 嗯,我认为这是“它是 Hibernate 错误还是我的错误?”问题,你可以猜到我倾向于哪个。显示上一个方法的代码。您还可以打开 Hibernate 的调试日志记录,这应该会显示您是否没有完成事务。
  • hibernate 日志没有显示任何异常,除了错误。前面方法的代码完全相同,只是它是 try 块中的查询。
  • 另外,我不认为这是一个休眠“错误”,但想知道线程问题是否在这里起作用(即使 junit 连续运行测试)。我向社区提出的问题是,除了没有正确关闭用户代码中的交易之外,是否还有其他原因导致此问题
  • 所以你为 hibernate 包启用了 TRACE 并且日志显示所有事务都被正确关闭,但是抛出了错误?
  • 很公平,不,调试。这里已经很晚了,代码大约需要 30 分钟才能编译。我明天检查并回复你

标签: java hibernate exception transactions


【解决方案1】:

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

似乎junit中的assert语句会退出一个方法,所以如果assert语句在commit之前,那么commit就不会发生。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多