Java JPA操作數據,事物控制不完整 clear(),merge()方法分析 – JAVA編程語言程序開發技術文章

最近在使用框架 spring+jpa+cxf 部署一個服務,出現的問題!
 
事務部分:
 
在Service的一個方法中,定義好瞭事務完整性控制
如:
Dao:
 
public class UserDao{
    @PersistenceContext
    private EntityManager em;
 
    public User saveOrUpdate(User u){
         //code
        return em.merge(u);
    }
 
    public boolean updateUserBySql(String jpa){
         try{
           em.createQuery(sql).executeUpdate();
           return true;
         }catch(Exception e){
             return false;
        }
    }
 
}
 
public class UserServiceImpl{
@Autowired
private UserDao userDao;
@Autowired
private TransactionService tranService;
 
//中間進行緩存基本配置信息的獲取(每隔半小時加載一次配置表裡面信息)
@Autowired
private CommonService commonService;
 
public Aresp updateUserTradeOrders(Areq req){
     TransactionStatus status = tranService.getTransactionStatus();
    try{
       User u = XXXX(req);  //把req對象變成需要的user對象
      String jpa = “update user sql”; //把該用戶所有的狀態為有效變成無效Sql
      boolean bool = userDao.updateUserBySql(jpa);
 
     if(bool){
         userDao.saveOrUpdate(u)
     }
    Aresp a = Aresp.createSuccess();
    a.setDesc(commonService.getSysconfig(a.getCode));
    transService.commit(status);
    return a;
}catch(Exception e){
e.pr;
    transService.rollback(status);
   return Aresp.createFaild();
}
}
}
 
CommonService 中方法是每隔半小時進行一個refluse,在refluse時候,會對em進行clear()調用,
 
提供方法的接口,測試都沒有問題! 後來測試時候突然發現半小時一次的,會更新掉用戶信息為無效,但是沒有把新增的實體保存,出現疑問:
1.雖然我代碼不合理,理論應該是先commit在去獲取描述語,但是我clear()調用後,也不存在以前有效狀態被修改為無效
2. clear()為什麼不能把所有的都清楚,都不變動我的數據,執行一半破壞事務的完整性,我使用事務控制的初衷
 
查看jpa的clear()方式使用和實踐:clear()方法分離所有當前正在被管理的實體
em.clear()把實體管理器中所有的實體對象編程遊離狀態
 merge是把實體與數據庫同步
通過兩點分析,如果。先merge一個不存在庫中數據,然後clear 在commit的對象是不會保存到庫中,如果庫中一開始就存在這條記錄的時候,commit後,會被更新

發佈留言