From e74486b1847526c5a5ca6d633e83274779c3a3d8 Mon Sep 17 00:00:00 2001 From: zhenggm Date: Sat, 18 Jun 2022 20:12:47 +0800 Subject: [PATCH] =?UTF-8?q?bug=EF=BC=9A=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=A3=80=E6=9F=A5=E5=8F=8AisExists?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smtweb/framework/core/cache/AbstractCache.java | 23 +++++++++++++++ .../cc/smtweb/framework/core/common/SwConsts.java | 1 + .../cc/smtweb/framework/core/db/EntityHelper.java | 33 ++++++++++++++++++++++ .../framework/core/db/cache/ModelTableCache.java | 19 ++++++++++--- .../core/db/impl/DefaultDatabaseInfoImpl.java | 6 ++-- .../smtweb/framework/core/db/jdbc/JdbcEngine.java | 9 +++++- .../cc/smtweb/framework/core/db/vo/ModelTable.java | 4 +-- .../core/mvc/service/DefaultDelHandler.java | 4 ++- .../bpm/web/design/form/CodeBuildHandler.java | 7 ++--- .../bpm/web/engine/dynPage/DynPageDelHandler.java | 2 ++ 10 files changed, 93 insertions(+), 15 deletions(-) diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java index b7f2305..8ba38ba 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java @@ -56,6 +56,7 @@ public abstract class AbstractCache implements ISwCache< 如资金科目明细项,需按资金科目缓存List。key=sc,value=class_id */ protected Map> mapListReg = new HashMap<>(); + protected Map> mapListRegEx = new HashMap<>(); protected Map> mapMapReg = new HashMap<>(); public AbstractCache() { @@ -128,6 +129,10 @@ public abstract class AbstractCache implements ISwCache< mapListReg.put(key, iGetBeanKey); } + protected void regListEx(String key, IGetBeanKeys iGetBeanKey) { + mapListRegEx.put(key, iGetBeanKey); + } + /** * 注册其他key的Map缓存,如按code缓存 * @@ -253,6 +258,13 @@ public abstract class AbstractCache implements ISwCache< doRemoveList(entry.getKey(), getBeanKey(entry.getValue(), oldbean), bean); } + for (Map.Entry> entry : mapListRegEx.entrySet()) { + String[] keys = entry.getValue().getKey(oldbean); + for (String k: keys) { + doRemoveList(entry.getKey(), k, bean); + } + } + for (Map.Entry> entry : mapMapReg.entrySet()) { doRemoveMap(entry.getKey(), getBeanKey(entry.getValue(), oldbean)); } @@ -273,6 +285,13 @@ public abstract class AbstractCache implements ISwCache< doUpdateList(entry.getKey(), getBeanKey(entry.getValue(), value), value); } + for (Map.Entry> entry : mapListRegEx.entrySet()) { + String[] keys = entry.getValue().getKey(value); + for (String k: keys) { + doUpdateList(entry.getKey(), k, value); + } + } + for (Map.Entry> entry : mapMapReg.entrySet()) { doUpdateMap(entry.getKey(), getBeanKey(entry.getValue(), value), value); } @@ -489,4 +508,8 @@ public abstract class AbstractCache implements ISwCache< public interface IGetBeanKey { String getKey(T bean); } + + public interface IGetBeanKeys { + String[] getKey(T bean); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/common/SwConsts.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/common/SwConsts.java index 380b2c3..65df21a 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/common/SwConsts.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/common/SwConsts.java @@ -15,4 +15,5 @@ public interface SwConsts { String PARAM_PAGE = "page"; String PARAM_ROWS = "rows"; String TOTAL_KEY = "total_count"; + String DEF_DB_NAME = "sys"; } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityHelper.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityHelper.java index 9ffa04d..03c981c 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityHelper.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityHelper.java @@ -2,8 +2,10 @@ package cc.smtweb.framework.core.db; import cc.smtweb.framework.core.cache.AbstractCache; import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.common.SwException; import cc.smtweb.framework.core.common.SwMap; import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.framework.core.db.vo.ModelField; import cc.smtweb.framework.core.db.vo.ModelLinkName; import cc.smtweb.framework.core.db.vo.ModelTable; import org.apache.commons.lang3.StringUtils; @@ -149,4 +151,35 @@ public class EntityHelper { } } } + + //检查表记录是否被引用 + public static void checkExists(long tableId, long id) { + ModelTable fkTable = ModelTableCache.getInstance().get(tableId); + if (fkTable == null) throw new SwException("待检查表(" + tableId + ")为空!"); + checkExists(fkTable, id); + } + public static void checkExists(String tableName, long id) { + ModelTable fkTable = ModelTableCache.getInstance().getByName(tableName); + if (fkTable == null) throw new SwException("待检查表(" + tableName + ")为空!"); + checkExists(fkTable, id); + } + + public static void checkExists(ModelTable fkTable, long id) { + Set list = ModelTableCache.getInstance().getByLink(fkTable.getId()); + if (list == null || list.isEmpty()) return; + for (ModelTable table: list) { + StringBuilder sql = new StringBuilder(256); + List args = new ArrayList<>(); + for (ModelField field: table.getFields()) { + if (field.getLink() == fkTable.getId()) { + sql.append(" or ").append(field.getName()).append("=?"); + args.add(id); + } + } + if (sql.length() == 0) continue; + if (DbEngine.getInstance().isExists("select 1 from " + table.getSchemaTableName() + " where " + sql.substring(4), args.toArray())) { + throw new SwException("该记录被表【" + table.getTitle() + "(" + table.getName() + ")】引用,不能删除!"); + } + } + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java index 457c8c1..703e606 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java @@ -4,16 +4,14 @@ import cc.smtweb.framework.core.annotation.SwCache; import cc.smtweb.framework.core.cache.AbstractCache; import cc.smtweb.framework.core.cache.CacheManager; import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.vo.ModelField; import cc.smtweb.framework.core.db.vo.ModelTable; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.ResultSetExtractor; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Set; +import java.util.*; /** * Created by Akmm at 2022/1/12 18:34 @@ -23,6 +21,7 @@ public class ModelTableCache extends AbstractCache { private final static String mk = "k"; private final static String md = "d"; private final static String mc = "c"; + private final static String mk_link = "l"; public static ModelTableCache getInstance() { return CacheManager.getIntance().getCache(ModelTableCache.class); @@ -32,6 +31,13 @@ public class ModelTableCache extends AbstractCache { regMap(mk, k-> k.getName().toUpperCase()); regList(md, k-> String.valueOf(k.getDbId())); regList(mc, k-> String.valueOf(k.getMcId())); + regListEx(mk_link, k-> { + Set list = new HashSet<>(); + for (ModelField field: k.getFields()) { + if (field.getLink() > 0) list.add(String.valueOf(field.getLink())); + } + return list.toArray(new String[list.size()]); + }); // regList(mf, k-> k.get); } @@ -109,4 +115,9 @@ public class ModelTableCache extends AbstractCache { ModelTable bean = get(id); return bean == null ? String.valueOf(id) : bean.getTitle(); } + + //根据外键 + public final Set getByLink(long tableId) { + return getListByKey(mk_link, String.valueOf(tableId)); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultDatabaseInfoImpl.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultDatabaseInfoImpl.java index eca592a..8e98425 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultDatabaseInfoImpl.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultDatabaseInfoImpl.java @@ -1,5 +1,6 @@ package cc.smtweb.framework.core.db.impl; +import cc.smtweb.framework.core.common.SwConsts; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.cache.ModelDatabaseCache; import cc.smtweb.framework.core.db.vo.ModelDatabase; @@ -215,12 +216,13 @@ public class DefaultDatabaseInfoImpl implements IDatabaseInfo { Collection list = ModelDatabaseCache.getInstance().getAll(); if (list != null && !list.isEmpty()) { for (ModelDatabase db : list) { - getColumnInfo(dbData, dbName + "_" + db.getName(), needsUpperCase, lookupSchemaName); + String dn = SwConsts.DEF_DB_NAME.equals(db.getName()) ? "" : ("_" + db.getName()); + getColumnInfo(dbData, dbName + dn, needsUpperCase, lookupSchemaName); } } } - getColumnInfo(dbData, null, needsUpperCase, lookupSchemaName); +// getColumnInfo(dbData, null, needsUpperCase, lookupSchemaName); } catch (SQLException e) { log.error(e.getMessage(), e); } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java index 8d1c38c..bfb6c1a 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java @@ -6,6 +6,8 @@ import cc.smtweb.framework.core.db.impl.BaseBean; import cc.smtweb.framework.core.exception.DbException; import cc.smtweb.framework.core.util.JsonUtil; import org.apache.commons.lang3.StringUtils; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; @@ -467,7 +469,12 @@ public class JdbcEngine { } /*=================以上为具名参数方法==================================================*/ public boolean isExists(String sql, Object... params) { - return jdbcTemplate.queryForObject(sql + " LIMIT 0, 1", int.class, params) > 0; + try { + Object v = jdbcTemplate.queryForObject(sql + " LIMIT 0, 1", Object.class, params); + return (v != null); + } catch (EmptyResultDataAccessException e) { + return false; + } } private RowMapper createRowMapper(Class type) { diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java index 5e05db1..8ffeea1 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java @@ -1,6 +1,7 @@ package cc.smtweb.framework.core.db.vo; import cc.smtweb.framework.core.annotation.SwTable; +import cc.smtweb.framework.core.common.SwConsts; import cc.smtweb.framework.core.common.SwEnum; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.cache.ModelDatabaseCache; @@ -14,7 +15,6 @@ import java.util.List; @SwTable(value = "ASP_MODEL_TABLE") public class ModelTable extends DefaultEntity { - public final static String DEF_DB_NAME = "sys"; public final static String ENTITY_NAME = "ASP_MODEL_TABLE"; /*冗余*/ @@ -276,7 +276,7 @@ public class ModelTable extends DefaultEntity { public String getSchemaTableName() { String dbName = getDbName(); - if (StringUtils.isEmpty(dbName) || dbName.equals(DEF_DB_NAME)) return getName(); + if (StringUtils.isEmpty(dbName) || dbName.equals(SwConsts.DEF_DB_NAME)) return getName(); return DbEngine.getInstance().getDbSchema() + "_" + dbName + "." + getName(); } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java index 873bfc5..de73fc3 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java @@ -4,6 +4,7 @@ import cc.smtweb.framework.core.cache.AbstractCache; import cc.smtweb.framework.core.cache.CacheManager; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.EntityHelper; import cc.smtweb.framework.core.db.cache.ModelTableCache; import cc.smtweb.framework.core.db.impl.DefaultEntity; import cc.smtweb.framework.core.db.vo.ModelTable; @@ -21,7 +22,8 @@ public class DefaultDelHandler extends AbstractDelHandl @Override protected void checkValid() { - ModelTable table = ModelTableCache.getInstance().getByName(tableName); + EntityHelper.checkExists(tableName, id); +// ModelTable table = ModelTableCache.getInstance().getByName(tableName); //todo 检查外键引用的使用情况 } diff --git a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/CodeBuildHandler.java b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/CodeBuildHandler.java index ad73fdf..77e4d72 100644 --- a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/CodeBuildHandler.java +++ b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/CodeBuildHandler.java @@ -1,9 +1,6 @@ package cc.smtweb.system.bpm.web.design.form; -import cc.smtweb.framework.core.common.R; -import cc.smtweb.framework.core.common.SwEnum; -import cc.smtweb.framework.core.common.SwException; -import cc.smtweb.framework.core.common.SwMap; +import cc.smtweb.framework.core.common.*; import cc.smtweb.framework.core.db.cache.ModelTableCache; import cc.smtweb.framework.core.db.vo.ModelCache; import cc.smtweb.framework.core.db.vo.ModelField; @@ -71,7 +68,7 @@ public class CodeBuildHandler extends AbstractHandler { if (form == null) throw new SwException("未找到指定的页面定义!"); String moduleName = ModelProjectCache.getInstance().getModule(form.getPrjId()); - if (StringUtils.isEmpty(moduleName) || moduleName.equals("sys") || moduleName.equals("bpm")) { + if (StringUtils.isEmpty(moduleName) || SwConsts.DEF_DB_NAME.equals(moduleName) || moduleName.equals("bpm")) { moduleName = "sw-system-bpm"; packageName = "cc.smtweb.system.bpm.web"; } else { diff --git a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java index 1c0cee7..80ac5bc 100644 --- a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java +++ b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java @@ -7,6 +7,7 @@ import cc.smtweb.framework.core.common.SwEnum; import cc.smtweb.framework.core.common.SwException; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.EntityHelper; import cc.smtweb.framework.core.db.cache.ModelTableCache; import cc.smtweb.framework.core.db.impl.DefaultEntity; import cc.smtweb.framework.core.db.jdbc.AbsDbWorker; @@ -131,6 +132,7 @@ public class DynPageDelHandler extends AbstractDynPageHandler { */ protected void checkBean(PageDataset pageDataSet, long id) { //校验外键引用关系 + EntityHelper.checkExists(pageDataSet.masterTable, id); } /**