考虑这个简单的Hibernate场景:
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)
到底怎么回事?
发布于 2011-03-01 21:22:24
嗯,看起来一旦我们到达tx.commit()
行,事务就已经提交了。我唯一的猜测是Hibernate在get()
对象时已经提交了事务。
解决这个问题的方法很简单:
// commit only if tx still hasn't been committed yet (by hibernate)
if (!tx.wasCommitted())
tx.commit();
发布于 2013-11-18 11:23:44
这是一个非常古老的问题,我想你已经解决了它(或者放弃了Hibernate),但是答案非常简单。我很惊讶没有其他人把它捡起来。
您还没有执行session.save(o),因此事务中没有要提交的内容。如果没有更改对象中的任何内容,提交可能仍然不起作用,但是如果什么都没有更改,为什么还要保存它呢?
顺便说一下:做session.get(...)也是完全可以接受的。在session.beginTransaction()之前。
发布于 2016-08-18 11:16:54
我知道这个问题已经解决了;尽管我在这里发布了我的答案。
我在事务上找不到wasCommitted()
方法。
但是下面的代码对我来说是有效的:
// commit only, if tx still hasn't been committed yet by Hibernate
if (tx.getStatus().equals(TransactionStatus.ACTIVE)) {
tx.commit();
}
https://stackoverflow.com/questions/5155039
复制相似问题