您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

事务未激活-hibernate-JPA

事务未激活-hibernate-JPA

可能tx.begin()引发了异常。这意味着该catch子句中没有要回滚的活动事务。这就是为什么tx.rollback()引发另一个异常(隐藏原始错误)的原因。

要查看源异常,请重写您的catch块:

} catch (RuntimeException re) {
    log.error("persist Failed", re); //moved to top
    tx.rollback();
    throw re;
}

同样不是在这里混概念。一方面,您要声明注入的实体管理器(@PersistenceContext),另一方面,您是通过EntityManagerFactory编程方式创建的。

如果这是一个JEE bean,则应如下所示:

@Stateless
public class TLinkEquipementDAOImpl implements TLinkEquipementDAO {   
    private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class);

    @PersistenceContext
    private EntityManager entityManager;

    public void persist(TLinkEquipement transientInstance) {
        log.debug("persisting TLinkEquipement instance");
        entityManager.persist(transientInstance);
        log.debug("persist successful");
    }
//Staff
}

此处,事务管理和实体管理器管理由容器(应用程序服务器)处理。

如果在容器外部使用此类,则可能如下所示:

public class TLinkEquipementDAOImpl implements TLinkEquipementDAO {   
    private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class);

    //I'm assuming getEntityManagerFactory() returnes an already created EMF
    private EntityManagerFactory emf = PersistenceManager.getInstance()
            .getEntityManagerFactory();
    private EntityManager entityManager = emf.createEntityManager();

    public void persist(TLinkEquipement transientInstance) {
        EntityTransaction tx = entityManager.getTransaction();
        log.debug("persisting TLinkEquipement instance");
        try {
            tx.begin();
            entityManager.persist(transientInstance);
            tx.commit();
            log.debug("persist successful");
        } catch (RuntimeException re) {
            log.error("persist Failed", re); 
            if(tx.isActive()) {
                tx.rollback();
            }
            throw re;
        }
    }
//Staff
}
其他 2022/1/1 18:15:13 有376人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶