> 文章列表 > Sharding-JDBC异常:Can not update sharding key

Sharding-JDBC异常:Can not update sharding key

Sharding-JDBC异常:Can not update sharding key

先上异常堆栈:

Hibernate: update Bbb set B1=?, TenantID=? where ID=?
2023-04-20 11:24:04.303 [http-nio-8090-exec-7] ERROR c.e.t.MyServiceImpl - 51******************出现异常:
org.apache.shardingsphere.underlying.common.exception.ShardingSphereException: Can not update sharding key, logic table: [Bbb], column: [org.apache.shardingsphere.sql.parser.sql.segment.dml.assignment.AssignmentSegment@2b0aaffb].at org.apache.shardingsphere.sharding.route.engine.validator.impl.ShardingUpdateStatementValidator.validate(ShardingUpdateStatementValidator.java:59)at org.apache.shardingsphere.sharding.route.engine.validator.impl.ShardingUpdateStatementValidator.validate(ShardingUpdateStatementValidator.java:42)at org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator.lambda$decorate$0(ShardingRouteDecorator.java:61)at java.util.Optional.ifPresent(Optional.java:159)at org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator.decorate(ShardingRouteDecorator.java:61)at org.apache.shardingsphere.sharding.route.engine.ShardingRouteDecorator.decorate(ShardingRouteDecorator.java:53)...
...
...at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)at com.sun.proxy.$Proxy205.flush(Unknown Source)at com.etoak.tian.MyServiceImpl.saveAaa(MyServiceImpl.java:178)
...
...
...

从异常字面意思理解:不能更新分库字段。而且前一句Hibernate打印的sql上看确实如此。

关键问题是:整个业务代码就没有任何更新操作,涉及到事务的只有对Aaa对象的save和delete,那么如何触发的这个update呢?

架构&业务背景:

1、Spring JPA + Sharding-JDBC

2、根据字段TenantID对业务表(Aaa、Bbb等)进行分库

问题现象:

调用saveAndFlush(Aaa)对象时,提示不能更新Bbb表。

最终原因定位:

使用JPA查出Bbb数据之后,由于业务需要,又对Bbb进行了赋值,而正是这个赋值操作触发了update,这就涉及到Hibernate中的实体对象状态管理,以及缓存等相关内容,需要大家自行延伸扩展。