2009-05-20 24 views
1

我有這樣的代碼:如何在JPA中刪除Spring中的事務?

run big query: Select all unprocessed objects from table A 
for each result 
    create or update an output object in table B 
    update input object: Set it to "processed" 

我想在循環體有一個交易,就是輸入一行被處理之後,更新的對象應承諾,這樣的程序中止的時候,它不會再處理所有行,而是從錯誤的行開始。我使用的Spring 2.5,休眠3.4和JPA(即我有一個EntityManager)。

我該怎麼做?我試圖在循環中調用em.getTransaction().commit(),但Spring不會允許這樣做。

回答

0

頭也不擡春天文檔,不知道您的交易設置:

首先你必須設置一個事務管理器(可能是HibernateTransactionManager)。然後恕我直言,最好使用Spring的TransactionTemplate在其自己的事務中運行每個迭代。您必須確保TransactionTemplate確實啓動了新的事務,或者在輸入方法時沒有運行事務。

一個提示:使用事務管理器的類名作爲調試事務行爲的日誌類別。

1

實體管理器讀取操作不需要事務。所以我會嘗試重構一個內部方法來更新行並將其設置爲事務性。請注意,它需要是使用@transactional的公共方法。