被这个错误耽误了2个小时,有必要记录一下。
错误信息
最近使用 Mybatis-Plus+ShardingShpere 操作数据库,遇到一个不能update的问题,异常信息是:ShardingException: Can not update sharding key
。我在网上搜了一下,遇到这个错误的人还不少,于是想当然的认为,这可能是ShardingShpere框架的问题(可能是一个bug)。
代码如下(十分简单的一个更新函数):
@Override
public boolean update(Order order) {
UpdateWrapper<OrderDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("order_id", order.getOrderId());
order.setUpdateTime(new Date());
return super.update(CONVERTER.convertToDO(order), updateWrapper);
}
解决方案
@Override
public boolean update(Order order) {
UpdateWrapper<OrderDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("order_id", order.getOrderId());
order.setOrderId(null);
order.setMaskId(null);
order.setUpdateTime(new Date());
return super.update(CONVERTER.convertToDO(order), updateWrapper);
}
其实解决方法十分简单,只需要把orderId和maskId都设置为null即可。
由于我们在shardingsphere-config.yaml对order表配置了2个shardingkey,如果只把orderId设置为null,还是会报错。需要把2个shardingkey同时设置为null。
经验教训
1、不要想当然以为框架不工作,这么简单的函数,一般框架是没问题的;
2、找人询问一下,打开思路,这次就是feiyang过来帮忙瞅了一眼,迅速解决了问题。
转载请注明:牛哥678 » ShardingSphere update函数报ShardingException: Can not update sharding key的问题