gpt4 book ai didi

java - HIbernate: "Nested Transactions not supported"当所有事务正确提交时

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:03 29 4
gpt4 key购买 nike

我读过一些关于这个主题的帖子:例如,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 方法并使用它来获取 session 解决了该问题:

public static Session resetCurrentSession()
{
Session oldsession = getSessionFactory().getCurrentSession();
if(oldsession.isOpen())
{
oldsession.close();
}
return getSessionFactory().getCurrentSession();
}

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

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

最佳答案

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

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

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

关于java - HIbernate: "Nested Transactions not supported"当所有事务正确提交时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397573/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com