浏览代码

fix github pull/3557 乐观锁新增版本号 null 自定义异常,租户插入忽略逻辑允许自定义

hubin 3 年之前
父节点
当前提交
766b8bc143

+ 14 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/TenantLineHandler.java

@@ -16,6 +16,9 @@
 package com.baomidou.mybatisplus.extension.plugins.handler;
 
 import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.schema.Column;
+
+import java.util.List;
 
 /**
  * 租户处理器( TenantId 行级 )
@@ -55,4 +58,15 @@ public interface TenantLineHandler {
     default boolean ignoreTable(String tableName) {
         return false;
     }
+
+    /**
+     * 忽略插入租户字段逻辑
+     *
+     * @param columns        插入字段
+     * @param tenantIdColumn 租户 ID 字段
+     * @return
+     */
+    default boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
+        return columns.stream().map(Column::getColumnName).anyMatch(i -> i.equalsIgnoreCase(tenantIdColumn));
+    }
 }

+ 11 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/OptimisticLockerInnerInterceptor.java

@@ -57,8 +57,11 @@ import java.util.Map;
  */
 @SuppressWarnings({"unchecked"})
 public class OptimisticLockerInnerInterceptor implements InnerInterceptor {
+    private RuntimeException exception;
 
-    private static final String PARAM_UPDATE_METHOD_NAME = "update";
+    public void setException(RuntimeException exception) {
+        this.exception = exception;
+    }
 
     @Override
     public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
@@ -87,12 +90,18 @@ public class OptimisticLockerInnerInterceptor implements InnerInterceptor {
                 // 旧的 version 值
                 Object originalVersionVal = versionField.get(et);
                 if (originalVersionVal == null) {
+                    if (null != exception) {
+                        /**
+                         * 自定义异常处理
+                         */
+                        throw exception;
+                    }
                     return;
                 }
                 String versionColumn = fieldInfo.getColumn();
                 // 新的 version 值
                 Object updatedVersionVal = this.getUpdatedVersionVal(fieldInfo.getPropertyType(), originalVersionVal);
-                if (PARAM_UPDATE_METHOD_NAME.equals(methodName)) {
+                if ("update".equals(methodName)) {
                     AbstractWrapper<?, ?, ?> aw = (AbstractWrapper<?, ?, ?>) map.getOrDefault(Constants.WRAPPER, null);
                     if (aw == null) {
                         UpdateWrapper<?> uw = new UpdateWrapper<>();

+ 3 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -116,17 +116,17 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
             return;
         }
         String tenantIdColumn = tenantLineHandler.getTenantIdColumn();
-        if (columns.stream().map(Column::getColumnName).anyMatch(i -> i.equals(tenantIdColumn))) {
+        if (tenantLineHandler.ignoreInsert(columns, tenantIdColumn)) {
             // 针对已给出租户列的insert 不处理
             return;
         }
-        columns.add(new Column(tenantLineHandler.getTenantIdColumn()));
+        columns.add(new Column(tenantIdColumn));
 
         // fixed gitee pulls/141 duplicate update
         List<Expression> duplicateUpdateColumns = insert.getDuplicateUpdateExpressionList();
         if (CollectionUtils.isNotEmpty(duplicateUpdateColumns)) {
             EqualsTo equalsTo = new EqualsTo();
-            equalsTo.setLeftExpression(new StringValue(tenantLineHandler.getTenantIdColumn()));
+            equalsTo.setLeftExpression(new StringValue(tenantIdColumn));
             equalsTo.setRightExpression(tenantLineHandler.getTenantId());
             duplicateUpdateColumns.add(equalsTo);
         }