交易未成功启动(而tx.commit()被if条件包围)

J88*_*888 5 java hibernate

第一次遇到这个错误我用t条件包围了我的tx.commit(),但不知道为什么我仍然收到这个错误.

Struts Problem Report

Struts has detected an unhandled exception:
Messages:   
Transaction not successfully started
File:   org/hibernate/engine/transaction/spi/AbstractTransactionImpl.java
Line number:    200
Stacktraces
org.hibernate.TransactionException: Transaction not successfully started

    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:200)
Run Code Online (Sandbox Code Playgroud)

用户选择产品后,在我的主要功能中,我将调用以下两个功能.

第一个检索所选产品对象的函数.第二个函数检查所选用户是否有产品,因此如果客户有产品则返回true,否则返回false;

功能1

  ....

    Product pro = new Product();
    final Session session = HibernateUtil.getSession();
    try {
        final Transaction tx = session.beginTransaction();
        try {

            pro = (Product) session.get(Product.class, id);

            if (!tx.wasCommitted()) {    
                     tx.commit();
            }
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        }
    } finally {
        HibernateUtil.closeSession();
    }
   .....
Run Code Online (Sandbox Code Playgroud)

功能2

 .....
 final Session session = HibernateUtil.getSession();
        try {
            final Transaction tx = session.beginTransaction();
            try {
                User user = (User) session.get(User.class, id);

                if (!tx.wasCommitted()) {    
                       tx.commit();
                }

                if(client.hasProduct(proId)){
                         return client.getProduct(proId);
                }
                return false;
            } catch (Exception e) {
                tx.rollback();                 <<<Error is on this line
                e.printStackTrace();
            }
        } finally {
            HibernateUtil.closeSession();
        }
  ....        
Run Code Online (Sandbox Code Playgroud)

Eam*_*ain 1

一种可能性是您在第二个函数中捕获的异常来自 后的代码,因此commit()您最终会尝试回滚已提交的事务,这是不允许的。

您可以尝试重新组织代码以确保提交后永远不会调用回滚。甚至可能是一些简单的事情,比如缩小内部 try-catch 的范围:

final Session session = HibernateUtil.getSession();
try {
  final Transaction tx = session.beginTransaction();

  try {
    User user = (User) session.get(User.class, id);

    if (!tx.wasCommitted()) {    
      tx.commit();
    }
  } catch (Exception e) {
    tx.rollback();
    e.printStackTrace();
  }

  if(client.hasProduct(proId)){
    return client.getProduct(proId);
  }
  return false;
} finally {
  HibernateUtil.closeSession();
}
Run Code Online (Sandbox Code Playgroud)