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

3 篇文章 0 订阅
1 篇文章 0 订阅

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值