[英]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.