ppj19891020 opened a new issue #1798: spring JPA simple sql update error
URL: https://github.com/apache/incubator-shardingsphere/issues/1798
 
 
   ## Bug Report
   spring jpa update domain fail.
   
   junit test
   ```
   @Test
       public void testUpdateMessage(){
           Long traceId = 3324610450175559130l;
           List<MessagePo> messagePos = messageRepository.getByTraceId(traceId);
           MessagePo messagePo = messagePos.get(0);
           messagePo.setStatus(ClickRequest.Status.CLICKED.name());
           messageRepository.save(messagePo);
       }
   ```
   
   ### Which version of ShardingSphere did you use?
    Version: 3.0.0
   
   ### Which project did you use? Sharding-JDBC or Sharding-Proxy?
    Sharding-JDBC
   
   
   ### Expected behavior
   sql update success
   
   ### Actual behavior
   ```
   2019-01-22 18:46:19.471  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Rule Type: sharding
   2019-01-22 18:46:19.471  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Logic SQL: select messagepo0_.id as 
id1_0_, messagepo0_.appVersion as appVersi2_0_, messagepo0_.clickTime as 
clickTim3_0_, messagepo0_.devicePlatform as devicePl4_0_, 
messagepo0_.deviceToken as deviceTo5_0_, messagepo0_.jobId as jobId6_0_, 
messagepo0_.osVersion as osVersio7_0_, messagepo0_.sendTime as sendTime8_0_, 
messagepo0_.status as status9_0_, messagepo0_.traceId as traceId10_0_, 
messagepo0_.userId as userId11_0_ from push_message messagepo0_ where 
messagepo0_.traceId=?
   2019-01-22 18:46:19.471  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : SQLStatement: 
SelectStatement(super=DQLStatement(super=AbstractSQLStatement(type=DQL, 
tables=Tables(tables=[Table(name=push_message, 
alias=Optional.of(messagepo0_))]), 
conditions=Conditions(orCondition=OrCondition(andConditions=[AndCondition(conditions=[Condition(column=Column(name=traceId,
 tableName=push_message), operator=EQUAL, positionValueMap={}, 
positionIndexMap={0=0})])])), sqlTokens=[TableToken(skippedSchemaNameLength=0, 
originalLiterals=push_message)], parametersIndex=1)), containStar=false, 
selectListLastPosition=411, groupByLastPosition=0, 
items=[CommonSelectItem(expression=messagepo0_.devicePlatform, 
alias=Optional.of(devicePl4_0_)), 
CommonSelectItem(expression=messagepo0_.deviceToken, 
alias=Optional.of(deviceTo5_0_)), 
CommonSelectItem(expression=messagepo0_.status, alias=Optional.of(status9_0_)), 
CommonSelectItem(expression=messagepo0_.appVersion, 
alias=Optional.of(appVersi2_0_)), 
CommonSelectItem(expression=messagepo0_.osVersion, 
alias=Optional.of(osVersio7_0_)), 
CommonSelectItem(expression=messagepo0_.userId, 
alias=Optional.of(userId11_0_)), 
CommonSelectItem(expression=messagepo0_.clickTime, 
alias=Optional.of(clickTim3_0_)), 
CommonSelectItem(expression=messagepo0_.jobId, alias=Optional.of(jobId6_0_)), 
CommonSelectItem(expression=messagepo0_.traceId, 
alias=Optional.of(traceId10_0_)), CommonSelectItem(expression=messagepo0_.id, 
alias=Optional.of(id1_0_)), CommonSelectItem(expression=messagepo0_.sendTime, 
alias=Optional.of(sendTime8_0_))], groupByItems=[], orderByItems=[], 
limit=null, subQueryStatement=null)
   2019-01-22 18:46:19.472  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Actual SQL: ds2 ::: select 
messagepo0_.id as id1_0_, messagepo0_.appVersion as appVersi2_0_, 
messagepo0_.clickTime as clickTim3_0_, messagepo0_.devicePlatform as 
devicePl4_0_, messagepo0_.deviceToken as deviceTo5_0_, messagepo0_.jobId as 
jobId6_0_, messagepo0_.osVersion as osVersio7_0_, messagepo0_.sendTime as 
sendTime8_0_, messagepo0_.status as status9_0_, messagepo0_.traceId as 
traceId10_0_, messagepo0_.userId as userId11_0_ from push_message messagepo0_ 
where messagepo0_.traceId=? ::: [[3324610450175559130]]
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Rule Type: sharding
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Logic SQL: select messagepo0_.id as 
id1_0_0_, messagepo0_.appVersion as appVersi2_0_0_, messagepo0_.clickTime as 
clickTim3_0_0_, messagepo0_.devicePlatform as devicePl4_0_0_, 
messagepo0_.deviceToken as deviceTo5_0_0_, messagepo0_.jobId as jobId6_0_0_, 
messagepo0_.osVersion as osVersio7_0_0_, messagepo0_.sendTime as 
sendTime8_0_0_, messagepo0_.status as status9_0_0_, messagepo0_.traceId as 
traceId10_0_0_, messagepo0_.userId as userId11_0_0_ from push_message 
messagepo0_ where messagepo0_.id=?
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : SQLStatement: 
SelectStatement(super=DQLStatement(super=AbstractSQLStatement(type=DQL, 
tables=Tables(tables=[Table(name=push_message, 
alias=Optional.of(messagepo0_))]), 
conditions=Conditions(orCondition=OrCondition(andConditions=[])), 
sqlTokens=[TableToken(skippedSchemaNameLength=0, 
originalLiterals=push_message)], parametersIndex=1)), containStar=false, 
selectListLastPosition=433, groupByLastPosition=0, 
items=[CommonSelectItem(expression=messagepo0_.osVersion, 
alias=Optional.of(osVersio7_0_0_)), 
CommonSelectItem(expression=messagepo0_.sendTime, 
alias=Optional.of(sendTime8_0_0_)), 
CommonSelectItem(expression=messagepo0_.userId, 
alias=Optional.of(userId11_0_0_)), 
CommonSelectItem(expression=messagepo0_.status, 
alias=Optional.of(status9_0_0_)), CommonSelectItem(expression=messagepo0_.id, 
alias=Optional.of(id1_0_0_)), CommonSelectItem(expression=messagepo0_.traceId, 
alias=Optional.of(traceId10_0_0_)), 
CommonSelectItem(expression=messagepo0_.appVersion, 
alias=Optional.of(appVersi2_0_0_)), 
CommonSelectItem(expression=messagepo0_.clickTime, 
alias=Optional.of(clickTim3_0_0_)), 
CommonSelectItem(expression=messagepo0_.jobId, alias=Optional.of(jobId6_0_0_)), 
CommonSelectItem(expression=messagepo0_.deviceToken, 
alias=Optional.of(deviceTo5_0_0_)), 
CommonSelectItem(expression=messagepo0_.devicePlatform, 
alias=Optional.of(devicePl4_0_0_))], groupByItems=[], orderByItems=[], 
limit=null, subQueryStatement=null)
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Actual SQL: ds0 ::: select 
messagepo0_.id as id1_0_0_, messagepo0_.appVersion as appVersi2_0_0_, 
messagepo0_.clickTime as clickTim3_0_0_, messagepo0_.devicePlatform as 
devicePl4_0_0_, messagepo0_.deviceToken as deviceTo5_0_0_, messagepo0_.jobId as 
jobId6_0_0_, messagepo0_.osVersion as osVersio7_0_0_, messagepo0_.sendTime as 
sendTime8_0_0_, messagepo0_.status as status9_0_0_, messagepo0_.traceId as 
traceId10_0_0_, messagepo0_.userId as userId11_0_0_ from push_message 
messagepo0_ where messagepo0_.id=? ::: [[4657956192256]]
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Actual SQL: ds1 ::: select 
messagepo0_.id as id1_0_0_, messagepo0_.appVersion as appVersi2_0_0_, 
messagepo0_.clickTime as clickTim3_0_0_, messagepo0_.devicePlatform as 
devicePl4_0_0_, messagepo0_.deviceToken as deviceTo5_0_0_, messagepo0_.jobId as 
jobId6_0_0_, messagepo0_.osVersion as osVersio7_0_0_, messagepo0_.sendTime as 
sendTime8_0_0_, messagepo0_.status as status9_0_0_, messagepo0_.traceId as 
traceId10_0_0_, messagepo0_.userId as userId11_0_0_ from push_message 
messagepo0_ where messagepo0_.id=? ::: [[4657956192256]]
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Actual SQL: ds2 ::: select 
messagepo0_.id as id1_0_0_, messagepo0_.appVersion as appVersi2_0_0_, 
messagepo0_.clickTime as clickTim3_0_0_, messagepo0_.devicePlatform as 
devicePl4_0_0_, messagepo0_.deviceToken as deviceTo5_0_0_, messagepo0_.jobId as 
jobId6_0_0_, messagepo0_.osVersion as osVersio7_0_0_, messagepo0_.sendTime as 
sendTime8_0_0_, messagepo0_.status as status9_0_0_, messagepo0_.traceId as 
traceId10_0_0_, messagepo0_.userId as userId11_0_0_ from push_message 
messagepo0_ where messagepo0_.id=? ::: [[4657956192256]]
   2019-01-22 18:46:20.171  INFO 24457 --- [           main] 
Sharding-Sphere-SQL                      : Actual SQL: ds3 ::: select 
messagepo0_.id as id1_0_0_, messagepo0_.appVersion as appVersi2_0_0_, 
messagepo0_.clickTime as clickTim3_0_0_, messagepo0_.devicePlatform as 
devicePl4_0_0_, messagepo0_.deviceToken as deviceTo5_0_0_, messagepo0_.jobId as 
jobId6_0_0_, messagepo0_.osVersion as osVersio7_0_0_, messagepo0_.sendTime as 
sendTime8_0_0_, messagepo0_.status as status9_0_0_, messagepo0_.traceId as 
traceId10_0_0_, messagepo0_.userId as userId11_0_0_ from push_message 
messagepo0_ where messagepo0_.id=? ::: [[4657956192256]]
   2019-01-22 18:46:20.188  INFO 24457 --- [           main] 
o.h.e.internal.DefaultLoadEventListener  : HHH000327: Error performing load 
command : org.hibernate.HibernateException: More than one row with the given 
identifier was found: 4657956192256, for class: 
com.dxy.platform.push.sharding.domain.MessagePo
   
   org.springframework.orm.jpa.JpaSystemException: More than one row with the 
given identifier was found: 4657956192256, for class: 
com.dxy.platform.push.sharding.domain.MessagePo; nested exception is 
org.hibernate.HibernateException: More than one row with the given identifier 
was found: 4657956192256, for class: 
com.dxy.platform.push.sharding.domain.MessagePo
   
        at 
org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:333)
        at 
org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
        at 
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:525)
        at 
org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
        at 
org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:209)
        at 
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at 
org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at 
org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
        at com.sun.proxy.$Proxy128.save(Unknown Source)
   ```
   
   ### Reason analyze (If you can)
   
   
   ### Steps to reproduce the behavior, such as: SQL to execute, sharding rule 
configuration, when exception occur etc.
   table: push_message
   KeyGeneratorColumnName:traceId
   ```
       @Bean(name = "shardingDataSource")
       public DataSource shardingDataSource() throws SQLException {
           // 配置真实数据源
           Map<String, DataSource> dataSourceMap = new HashMap<>();
           dataSourceMap.put("ds0",sharding01DataSource());
           dataSourceMap.put("ds1",sharding02DataSource());
           dataSourceMap.put("ds2",sharding03DataSource());
           dataSourceMap.put("ds3",sharding04DataSource());
   
           // 配置Order表规则
           TableRuleConfiguration orderTableRuleConfig = new 
TableRuleConfiguration();
           orderTableRuleConfig.setLogicTable("push_message");
           orderTableRuleConfig.setActualDataNodes("ds${0..3}.push_message");
   
           //分布式主键
           orderTableRuleConfig.setKeyGeneratorColumnName("id");
           orderTableRuleConfig.setKeyGenerator(shardingKeygen);
   
           // 配置分库 + 分表策略
           orderTableRuleConfig.setDatabaseShardingStrategyConfig(new 
InlineShardingStrategyConfiguration("traceId", "ds${traceId % 4}"));
   
           // 配置分片规则
           ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfiguration();
           shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
   
           //配置项
           Properties properties = new Properties();
           properties.setProperty("sql.show","true");
           DataSource dataSource = ShardingDataSourceFactory.createDataSource(
                   dataSourceMap, shardingRuleConfig, new ConcurrentHashMap(), 
properties);
           return dataSource;
       }
   ```
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to