فهرست منبع

Repair There may be a proxy object problem

Caratacus 8 سال پیش
والد
کامیت
708c96a3dd
1فایلهای تغییر یافته به همراه11 افزوده شده و 7 حذف شده
  1. 11 7
      src/main/java/com/baomidou/mybatisplus/plugins/OptimisticLockerInterceptor.java

+ 11 - 7
src/main/java/com/baomidou/mybatisplus/plugins/OptimisticLockerInterceptor.java

@@ -8,6 +8,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.executor.Executor;
@@ -23,6 +24,7 @@ import com.baomidou.mybatisplus.annotations.Version;
 import com.baomidou.mybatisplus.entity.TableFieldInfo;
 import com.baomidou.mybatisplus.entity.TableInfo;
 import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.toolkit.ClassUtils;
 import com.baomidou.mybatisplus.toolkit.ReflectionKit;
 import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 
@@ -51,8 +53,8 @@ import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
 @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
 public class OptimisticLockerInterceptor implements Interceptor {
 
-    private final Map<Class<?>, EntityField> versionFieldCache = new HashMap<>();
-    private final Map<Class<?>, List<EntityField>> entityFieldsCache = new HashMap<>();
+    private final Map<Class<?>, EntityField> versionFieldCache = new ConcurrentHashMap<>();
+    private final Map<Class<?>, List<EntityField>> entityFieldsCache = new ConcurrentHashMap<>();
 
     private static final String MP_OPTLOCK_VERSION_ORIGINAL = "MP_OPTLOCK_VERSION_ORIGINAL";
     private static final String MP_OPTLOCK_VERSION_COLUMN = "MP_OPTLOCK_VERSION_COLUMN";
@@ -89,7 +91,8 @@ public class OptimisticLockerInterceptor implements Interceptor {
             if (ew != null) {
                 Object entity = ew.getEntity();
                 if (entity != null) {
-                    EntityField ef = getVersionField(entity.getClass());
+                    Class<?> entityClass = ClassUtils.getUserClass(entity.getClass());
+                    EntityField ef = getVersionField(entityClass);
                     Field versionField = ef == null ? null : ef.getField();
                     if (versionField != null) {
                         Object originalVersionVal = versionField.get(entity);
@@ -101,16 +104,17 @@ public class OptimisticLockerInterceptor implements Interceptor {
             } else if (et != null) {
                 String methodId = ms.getId();
                 String updateMethodName = methodId.substring(ms.getId().lastIndexOf(".") + 1);
-                if (PARAM_UPDATE_METHOD_NAME.equals(updateMethodName)) {//update(entity, null) -->> update all. ignore version
+                if (PARAM_UPDATE_METHOD_NAME.equals(updateMethodName)) {//update(entityClass, null) -->> update all. ignore version
                     return invocation.proceed();
                 }
-                EntityField entityField = this.getVersionField(et.getClass());
+                Class<?> entityClass = ClassUtils.getUserClass(et.getClass());
+                EntityField entityField = this.getVersionField(entityClass);
                 Field versionField = entityField == null ? null : entityField.getField();
                 Object originalVersionVal;
                 if (versionField != null && (originalVersionVal = versionField.get(et)) != null) {
-                    TableInfo tableInfo = TableInfoHelper.getTableInfo(et.getClass());
+                    TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
                     Map<String, Object> entityMap = new HashMap<>();
-                    List<EntityField> fields = getEntityFields(et.getClass());
+                    List<EntityField> fields = getEntityFields(entityClass);
                     for (EntityField ef : fields) {
                         Field fd = ef.getField();
                         if (fd.isAccessible()) {