休眠事务未成功启动

2022-09-01 11:25:22

请考虑以下简单的休眠方案:

session = getHibernateSession();
tx = session.beginTransaction();
SomeObject o = (SomeObject) session.get(SomeObject.class, objectId);
tx.commit();

此代码生成以下异常:

org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)
    at com.bigco.package.Clazz.getSomeData(Clazz.java:1234)

这是怎么回事?


答案 1

好吧,看起来一旦我们到达该行,事务就已经提交。我唯一的猜测是Hibernate在处理对象时已经提交了事务。tx.commit()get()

此问题的修复方法很简单:

// commit only if tx still hasn't been committed yet (by hibernate)
if (!tx.wasCommitted())
    tx.commit();

答案 2

这是一个非常古老的问题,我想你已经解决了它(或者放弃了Hibernate),但答案非常简单。我很惊讶没有其他人拿起它。

您尚未执行 session.save(o),因此事务中没有要提交的内容。如果您没有更改对象中的任何内容,则提交可能仍然不起作用,但是如果没有任何更改,为什么要保存它呢?

顺便说一句:在 session.beginTransaction() 之前执行 session.get(...) 也是完全可以接受的。


推荐