簡體   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