乌龙!mybatis-plus的@TableId注解不生效,原来竟是因为它! ...

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

【先来个小测试】

大家觉得下面的sql返回什么?
  1. select * from table1 where null=1
复制代码
 
答案:无返回。因为null=1是个false的表达式。这就像我们写where 1=2一样。
 
【↓↓正文开始↓↓】

需求开发完成,将开发分支merge到test分支,部署测试环境提测后,QA提了一个bug,附下面log截图。 


通过logtrace排查程序,定位到如下代码。代码很简单,调用mybatis-plus的getById函数按主键查数据得到entity对象。PayMerchantBankCardFlow这个实体类里在主属性里是标记了@TableId的。那么,mybatis-plus底层拼接sql时,怎么没有把主键字段拼出来呢?
  1. PayMerchantBankCardFlow bankCardFlow = payMerchantBankCardFlowManager.getById(cardBindDTO.getFlowNo());
复制代码
 
  1. @TableName(value = "pay_merchant_bankcard_flow",autoResultMap = true)
  2. public class PayMerchantBankCardFlow implements Serializable {
  3.     private static final long serialVersionUID = 5112092241305418545L;
  4.     /**请求流水号*/
  5.     @JsonSerialize(using= ToStringSerializer.class)
  6.     @TableId(type = IdType.ID_WORKER)
  7.     private Long flowNo;
复制代码
 
这确实令人费解!当时我在参加一个代码评审会,修复bug优先,于是临时在PayMerchantBankCardFlowManager里重写了getById。然后发布让QA继续后续的功能测试。
  1. public class PayMerchantBankCardFlowManager{
  2.     @Override
  3.     public PayMerchantBankCardFlow getById(Serializable id) {
  4.         return getOne(Wrappers.query(new PayMerchantBankCardFlow().setFlowNo((Long) id)));
  5.     }
复制代码
 
bugfix就算完事了吗?不,作为靠谱的程序员,我们有必要对这个bug查明原因。
一个小伙在本地通过junit测试,发现getById是没问题的。当然,凭借我们历往对mybatis-plus的掌握程度,这个@TableId必然不会有问题的。
但是结论呢?为什么本地没bug而测试环境有bug呢?
这时就考验技术人员的综合能力了。
还是组内的jason同学协助给破解了。
原来,在test分支里,PayMerchantBankCardFlow#flowNo的@TableId注解被别的开发分支给合没了。这下就真相大白了。
最终修正代码,还原临时改动的代码,这个乌龙事件得以消停。
 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表