[英]Problem with transaction commit in @Transactional methods using Java Spring and Hibernate and EntityManager
[英]Spring EntityManager Commit Transaction as method completes
我正在使用spring EntityManager
並且需要在方法完成時提交記錄。 那就是我有兩種方法用於ex ::
@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方法中的下一個循環。
如何完成方法?
檢查文檔 。
方法可見性和@Transactional
使用代理時,應僅將@Transactional注釋應用於具有公共可見性的方法。 如果使用@Transactional注釋對受保護的,私有的或程序包可見的方法進行注釋,則不會引發任何錯誤,但是帶注釋的方法不會顯示已配置的事務設置。 如果需要注釋非公共方法,請考慮使用AspectJ(請參見下文)。
即使您的方法是公共的,也要在同一類的另一個方法中調用它,所以您不會使用代理,並且insertIntoDB
方法上的@Transactional(propagation=Propagation.REQUIRES_NEW)
無效。
因此,請像文檔一樣在AspectJ模式下嘗試。
嘗試如下所示使用:
@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 = Propagation.REQUIRES_NEW”,則它將創建一個新事務,並在insertIntoDB方法完成時提交該事務。
@Transactional僅在調用方法throw proxy時起作用,因此在您的情況下不起作用。 如果您確實希望您的更改反映在與活動事務相關聯的數據庫和PersistenceContext中,則可以使用
EntityManager.flush();
但是請記住,使用flush()時,遇到刷新后,對數據的更改會反映在數據庫中,但是它仍處於事務中並且可以回滾並且事務仍處於活動狀態,但是當您使用commit()時,會進行更改進入數據庫,交易也就此結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.