diff --git a/mybatis-flex-core/pom.xml b/mybatis-flex-core/pom.xml index db237694..bc745c0d 100644 --- a/mybatis-flex-core/pom.xml +++ b/mybatis-flex-core/pom.xml @@ -98,6 +98,13 @@ test + + com.mybatis-flex + mybatis-flex-annotation + 1.7.3 + compile + + diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java index 1ed8774a..f57ec50a 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexDefaultResultSetHandler.java @@ -15,6 +15,7 @@ */ package com.mybatisflex.core.mybatis; +import com.mybatisflex.core.util.StringUtil; import org.apache.ibatis.annotations.AutomapConstructor; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.binding.MapperMethod.ParamMap; @@ -767,7 +768,8 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler { List constructorArgs, Constructor constructor, boolean foundValues) throws SQLException { for (int i = 0; i < constructor.getParameterTypes().length; i++) { Class parameterType = constructor.getParameterTypes()[i]; - String columnName = rsw.getColumnNames().get(i); + Parameter parameter = constructor.getParameters()[i]; + String columnName = StringUtil.camelToUnderline(parameter.getName()); TypeHandler typeHandler = rsw.getTypeHandler(parameterType, columnName); Object value = typeHandler.getResult(rsw.getResultSet(), columnName); constructorArgTypes.add(parameterType); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/MapperInvocationHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/MapperInvocationHandler.java index db6e1430..b61464c8 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/MapperInvocationHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/MapperInvocationHandler.java @@ -70,7 +70,7 @@ public class MapperInvocationHandler implements InvocationHandler { //最终通过数据源 自定义分片 策略去获取 String shardingDataSourceKey = DataSourceKey.getByShardingStrategy(dataSourceKey, proxy, method, args); if (shardingDataSourceKey != null && !shardingDataSourceKey.equals(dataSourceKey)) { - DataSourceKey.use(dataSourceKey); + DataSourceKey.use(shardingDataSourceKey); needClearDsKey = true; } diff --git a/mybatis-flex-processor/pom.xml b/mybatis-flex-processor/pom.xml index 140d55ab..23b4b073 100644 --- a/mybatis-flex-processor/pom.xml +++ b/mybatis-flex-processor/pom.xml @@ -22,7 +22,7 @@ com.mybatis-flex mybatis-flex-annotation - ${mybatis-flex.version} + 1.7.3 diff --git a/mybatis-flex-spring-boot-starter/pom.xml b/mybatis-flex-spring-boot-starter/pom.xml index 8ce9c903..4d4f80f6 100644 --- a/mybatis-flex-spring-boot-starter/pom.xml +++ b/mybatis-flex-spring-boot-starter/pom.xml @@ -101,6 +101,12 @@ true + + com.mybatis-flex + mybatis-flex-core + 1.7.3 + + diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java index 803b304e..d482dea5 100644 --- a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionManager.java @@ -18,6 +18,7 @@ package com.mybatisflex.spring; import com.mybatisflex.core.transaction.TransactionContext; import com.mybatisflex.core.transaction.TransactionalManager; import com.mybatisflex.core.util.StringUtil; +import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.support.AbstractPlatformTransactionManager; @@ -63,23 +64,29 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager { protected void doCommit(DefaultTransactionStatus status) throws TransactionException { TransactionObject transactionObject = (TransactionObject) status.getTransaction(); TransactionalManager.commit(transactionObject.currentXid); + transactionObject.clear(); } @Override protected void doRollback(DefaultTransactionStatus status) throws TransactionException { TransactionObject transactionObject = (TransactionObject) status.getTransaction(); TransactionalManager.rollback(transactionObject.currentXid); + transactionObject.clear(); } @Override protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException { // 在多个事务嵌套时,子事务的传递方式为 REQUIRED(加入当前事务) // 那么,当子事务抛出异常时,会调当前方法,而不是直接调用 doRollback - // 此时,不需要做任何处理即可,默认上父级事务进行正常 doRollback 即可。 + // 此时,需要标识 prevXid 进行 Rollback + TransactionObject transactionObject = (TransactionObject) status.getTransaction(); + transactionObject.setRollbackOnly(); } - static class TransactionObject { + static class TransactionObject extends JdbcTransactionObjectSupport { + + private static final ThreadLocal ROLLBACK_ONLY_XIDS = new ThreadLocal<>(); private final String prevXid; private String currentXid; @@ -88,6 +95,18 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager { this.prevXid = prevXid; } + public void setRollbackOnly(){ + ROLLBACK_ONLY_XIDS.set(prevXid); + } + + public void clear(){ + ROLLBACK_ONLY_XIDS.remove(); + } + + @Override + public boolean isRollbackOnly() { + return currentXid.equals(ROLLBACK_ONLY_XIDS.get()); + } } } diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java index 43288bce..f346fee5 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java @@ -117,8 +117,14 @@ public class AccountController { account.setUserName("haha1111"); accountMapper.update(account); - //嵌套事务 - accountService.update2(); + try { + //嵌套事务 + accountService.update2(); + }catch (Exception e){ +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + System.out.println(">>>>>>e"+e); + } + return accountMapper.selectOneById(id); }