Hibernate事务未成功启动

时间:2011-03-01 13:20:35

标签: java hibernate

考虑这个简单的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)

发生了什么事?

7 个答案:

答案 0 :(得分:45)

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

对此的修复很简单:

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:6)

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

我还没有在交易中找到result方法。

但以下代码对我有用:

wasCommitted()

答案 3 :(得分:0)

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

@TransactionManagement(TransactionManagementType.BEAN)

还有更多内容,但这是故事的开始。

答案 4 :(得分:0)

删除session.close();从您的程序中获取,因为很少有较大的事务需要更多时间,并且在关闭连接时会发生连接问题。仅使用session.flus()。

答案 5 :(得分:0)

您应该检查使用此会话的天气。getTransaction()。commit();或回滚命令,因为较高版本的hibernate通过使用删除了手动代码交互 @Transactional(propagation = Propagation.SUPPORTS,readOnly = false,rollbackFor = Exception.class)批注可以避免任何与事务相关的异常。

答案 6 :(得分:0)

以上解决方案对我没有帮助,这就是为什么我想分享我的解决方案。

就我而言,我在一个实体中未正确使用@Column注释。我从更改了代码

@Column(columnDefinition = "false") 
private boolean isAvailable;

@Column(columnDefinition = "boolean default false") 
private boolean isAvailable;

它奏效了。

我在dao中的创建方法

public int create(Item item) {
    Session session = sessionFactory.getCurrentSession();
    try {

          int savedId = (int) session.save(item);
          return savedId;
        } catch (Exception e) {
          e.printStackTrace();
          session.getTransaction().rollback();
          return 0; //==> handle in custom exception
        }
}