如何避免org.hibernate.TransactionException:事务未成功启动

时间:2014-07-12 12:44:01

标签: hibernate spring-mvc

我有一个方法

@Transactional
public void initCityData(List<StoreDataVO> storeDataVos, City city) throws Exception {
    Session session = sessionFactory.getCurrentSession();
    Transaction txn = session.getTransaction();

    for (int i = 0; i < storeDataVos.size(); i++) {
        StoreDataVO storeDataVO = storeDataVos.get(i);
        processStore(city, storeDataVO);
        if (i % 10 == 0) {
            txn.commit();
            txn = session.beginTransaction();
        }
    }
    txn.commit();
    // spring will commit it in the end
    session.beginTransaction();
    logger.info("Store save done");
}

此方法抛出异常如何避免org.hibernate.TransactionException:事务未成功启动

2 个答案:

答案 0 :(得分:0)

您似乎正在使用声明式和程序式事务划分。

如果您使用@Transactional,Spring会为您管理您的交易,因此您不需要诸如beginTransaction和commit之类的调用。

答案 1 :(得分:0)

你在这里做错了的是你有整个方法Transactional by annotation @Transactional所以Spring会自动处理这个所有必要的步骤,比如bigin end rollback等。

现在您已在事务中明确声明了一个事务,当您执行txn = session.beginTransaction();时,代码会中断,并且由于在方法级别指定了注释,因此事务已经启动,因此会抛出异常。

因此,您要么删除方法级别注释,要么删除方法中的事务。