首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >休眠事务未成功启动

休眠事务未成功启动
EN

Stack Overflow用户
提问于 2011-03-01 21:20:35
回答 7查看 74.3K关注 0票数 27

考虑这个简单的Hibernate场景:

代码语言:javascript
复制
session = getHibernateSession();
tx = session.beginTransaction();
SomeObject o = (SomeObject) session.get(SomeObject.class, objectId);
tx.commit();

此代码生成以下异常:

代码语言:javascript
复制
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)

到底怎么回事?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-01 21:22:24

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

解决这个问题的方法很简单:

代码语言:javascript
复制
// commit only if tx still hasn't been committed yet (by hibernate)
if (!tx.wasCommitted())
    tx.commit();
票数 52
EN

Stack Overflow用户

发布于 2013-11-18 11:23:44

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

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

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

票数 10
EN

Stack Overflow用户

发布于 2016-08-18 11:16:54

我知道这个问题已经解决了;尽管我在这里发布了我的答案。

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

但是下面的代码对我来说是有效的:

代码语言:javascript
复制
// commit only, if tx still hasn't been committed yet by Hibernate
if (tx.getStatus().equals(TransactionStatus.ACTIVE)) { 
    tx.commit();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5155039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档