繁体   English   中英

Hibernate和Spring事务管理器:事务未成功启动

[英]Hibernate and Spring Transaction Manager: Transaction Not Successfully Started

我有一个通用存储库,带有一个名为saveList()的方法。 此方法的目的是获取一个List并将其保留在500个对象的“块”中。 不幸的是,当我进入提交时,我收到“ TransactionException:事务未成功启动”的信息。

我所看到的一切都说这是Spring事务管理器的结果。 不幸的是,对于这种特定方法,我需要手动控制事务。

相关代码如下:

// from generic non-abstract repository
@Transactional
public void saveList(List<T> objectList) {
    Session session = sessionFactory.getCurrentSession();
    Transaction tx = session.beginTransaction();
    int i = 1;
    for (T obj : objectList) {

        session.save(obj);
        //sessionFactory.getCurrentSession().save(obj);
        i++;
        if (i % 500 == 0) {
            session.flush();
            //sessionFactory.getCurrentSession().flush();
        }
    }
    if (!tx.wasCommitted()) {
        tx.commit();
    }
    //sessionFactory.getCurrentSession().getTransaction().commit();
}

从applicationContext.xml进行配置:

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

任何帮助表示赞赏。

您同时使用了声明式和程序化事务划分。 摆脱session.beginTransaction()和相关的方法调用。 仅使用@Transactional。

使用openSession方法获取会话对象,并在完成工作后将其关闭。 它将完美地工作。 例如

Session session = sessionFactory.openSession();

如果必须使用手动事务,则摆脱顶部的声明性@Transactional选项。

我真的看不出这样做的意义,因为在两次刷新之间不会清除会话(因此将需要与在事务结​​束时让Hibernate刷新一样多的内存),但是如果您确实想这样做这,并且只想为此方法进行新的交易,只需使用

@Transactional(propagation = Propagation.REQUIRES_NEW)

忘记了Hibernate事务管理。

这将使Spring暂停当前事务(如果有),启动新事务,执行您的方法并提交/回滚新事务,然后恢复已暂停的事务(如果有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM