我正在尝试将我们的代码库从Hibernate 3.6升级到4.0(这是让我们更新更新的第一步)。即使我们在确保事务是isActive()之后调用commit(),我也遇到了一个没有发出COMMIT的问题。
在对Postgres数据库成功运行某些查询时,我在Postgres日志中看到了这一点:
2014-12-30 20:09:39 CST LOG: execute <unnamed>: SET extra_float_digits=3
2014-12-30 20:09:39 CST LOG: execute S_1: BEGIN
2014-12-30 20:09:39 CST LOG: execute <unnamed>: -- This script........
注意那里的BEGIN,然后是一个简单提交调用的例子:
if (sf.getCurrentSession().getTransaction().isActive()) {
sf.getCurrentSession().getTransaction().commit();
}
我已调试到AbstractTransactionImpl并正在查看Jdbc4Connection commit()方法,并看到正在跳过实际的COMMIT调用.....但我不知道为什么。这是失败的if语句(它在AbstractJdbc2Connection中)。
if (protoConnection.getTransactionState() != ProtocolConnection.TRANSACTION_IDLE)
executeTransactionCommand(commitQuery);
所以,显然我们的事务状态是== ProtocolConnection.TRANSACTION_IDLE。但是,我不完全确定这会带来什么,为什么当事务表明它是isActive()时我们会遇到这个问题?
注意:这个相同的代码在Hibernate 3.6上适用于我们。
感谢。
UPDATE :我进一步调试了,看起来有很多ProtocoalConnectionImpl对象被构造,这是否表明我们的软件方面有问题,它不应该做什么?就像这表明我们正在打开只是闲逛的连接?感谢您提供更多见解。
答案 0 :(得分:0)
事实证明我做错了事(惊喜)。有一个很好的理由,即TransactionState显示为TRANSACTION_IDLE而不是发出提交。
我曾经在internetz上的多个地方看到过,人们可以通过访问底层的ConnectionProvider来访问新的Hibernate 4.x域中的JDBC连接(类似于:https://stackoverflow.com/a/21271019/115694)。 / p>
然而,这样做的问题在于您获得了全新的连接....而不是与当前会话相关联的连接。这是一个非常大的禁忌,或者至少对我们来说是这样。
事实上你必须做这个人在这个答案中说的话: https://stackoverflow.com/a/3526626/115694
基本上,您必须使用Work API。