Hibernate事务未成功启动

Yuv*_*dam 24 java hibernate

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

session = getHibernateSession();
tx = session.beginTransaction();
SomeObject o = (SomeObject) session.get(SomeObject.class, objectId);
tx.commit();
Run Code Online (Sandbox Code Playgroud)

此代码生成以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Yuv*_*dam 46

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

解决这个问题很简单:

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


sed*_*dge 8

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

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

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


小智 6

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

我还没有wasCommitted()在交易中找到方法.

但是以下代码对我有用:

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