Hibernate事务未成功启动

考虑一下这个简单的Hibernate场景:

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

此代码生成以下exception:

 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) 

这是怎么回事?

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

解决这个问题很简单:

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

这是一个非常古老的问题,我认为你已经解决了它(或者放弃了Hibernate),但答案很简单。 我很惊讶没人接过来。

您还没有完成session.save(o),因此事务中没有任何内容可以提交。 如果您没有更改对象中的任何内容,则提交可能仍然无效,但如果没有更改,您为什么要保存它?

BTW:在session.beginTransaction()之前执行session.get(…)也是完全可以接受的。

我知道这已经解决了; 即使我在这里发布我的答案。

我没有在事务上找到wasCommitted()方法。

但是以下代码对我有用:

 // commit only, if tx still hasn't been committed yet by Hibernate if (tx.getStatus().equals(TransactionStatus.ACTIVE)) { tx.commit(); } 

这种情况可能发生的一种情况是代码在使用容器管理事务(CMT)的EJB / MDB中,无论是有意还是因为它是默认值。 要使用bean管理的事务,请添加以下注释:

@TransactionManagement(TransactionManagementType.BEAN)

除此之外还有更多,但这是故事的开始。