2016-08-02 42 views
0

我正在使用彈簧EntityManager並且需要提交方法完成記錄。這就是我對前::Spring EntityManager提交事務作爲方法完成

@Override 
    @Transactional 
    public void upsert(String lastSuccessfullRun) { 
     for(tableData in Tables){ 
     insertIntoDB(tableData); 
     } 
    } 

和方法,這兩種方法insertIntoDB包含實際執行更新查詢

@Override 
    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    public void insertIntoDB (String tableData) { 
     em.persist(tableData) 
    } 

的樓內設有商務邏輯但問題是,該方法不承諾,因爲它在upsert方法中返回下一個循環。

我該如何提交方法完成?

+0

經過堅持,你可以嘗試'entityManager.getTransaction()。commit();',你也可以批量提交,而不是每個對象,如果有幾個。 –

+0

@NayanWadekar由於我使用的是Spring EntityManager,我不能使用'getTransaction()'方法,它會拋出異常,因爲在spring容器之外無法管理事務。 –

+0

對不起,Spring並沒有太多,這似乎相似 - http://stackoverflow.com/q/12897882/366964 –

回答

2

檢查documentation

方法的知名度和@Transactional

當使用代理服務器,你應該應用@Transactional註解 只與公衆知名度的方法。如果使用@Transactional註釋 註釋受保護的 私有或包可見方法,則不會引發錯誤,但帶註釋的方法不會顯示配置的事務設置 。如果您需要註釋非公共方法,請考慮使用AspectJ(請參閱下面的 )。

即使你的方法是公共的,你調用它在同一類的另一種方法,這樣你就不會trugh代理和@Transactional(propagation=Propagation.REQUIRES_NEW)insertIntoDB方法沒有效果。

所以在AspectJ模式下試試吧,就像在文檔中一樣。

+0

如果我使用內部類,那麼它會工作,我的意思是相同的代理機制? –

+0

@Anand j。 Kadhi不確定...你必須嘗試。 –

0

嘗試使用,如下圖所示:

@Override 
    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    public void upsert(String lastSuccessfullRun) { 
     for(tableData in Tables){ 
     insertIntoDB(tableData); 
     } 
    } 



@Override 
    @Transactional(propagation=Propagation.SUPPORTS) 
    public void insertIntoDB (String tableData) { 
     em.persist(tableData) 
    } 
如果您在insertIntoDB方法使用「傳播= Propagation.REQUIRES_NEW」

那麼它會創建一個新的事務並提交時insertIntoDB方法完成。

0

@Transactional只有當你調用方法拋出代理,所以在你的情況下它不起作用。如果你真的想你的變化體現在數據庫中,以你的活動事務相關的PersistenceContext可以使用

EntityManager.flush(); 

但是在使用沖洗時(記住這一點)的數據更改反映在數據庫之後遇到刷新,但它仍然處於事務中,並且可以回滾並且事務仍處於活動狀態,但是當您使用commit()時,更改將進入數據庫&事務也會在那裏結束。

相關問題