【发布时间】: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