当前位置:编程学习 > JAVA >>

Java JPA操作数据,事物控制不完整 clear(),merge()方法分析

最近在使用框架 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后,会被更新

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,