CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

背景

因为开发中使用到了jfinal-weixin,但jfinal-weixin对多公众号(或者小程序)的支持还不是太好,需要自己增加一些处理来更好的使用。如果你使用Java有些时日了,一定会想到重写jar包的类方法。

步骤

  1. 确定需要重写类的包路径
  2. 在项目的src目录下创建同名包
  3. 将需要重写的类拷贝到刚创建的目录,有源码使用源码,无源码可采用反编译的代码(IDEA一般会帮你反编译)
  4. 重写或者增加自己需要的方法

问题及处理

当你一套组合拳打完,准备部署收工的时候,却报错了。

1
java.lang.NoSuchMethodError:com....

教科书里总是骗人的。这个时候你需要看看下面的文档。

https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html

只是自己读书不够多而已,此时可能过指定-cp的方式来确定加载顺序。

背景

因为需要部署一台新的测试机,之前知道apline比较小巧,于是选用了java:jdk8-apline的基础镜像。但我们在部署Jfinal项目(采用undertow文件夹方式部署,通过start.sh启动并后台运行)的过程碰到一些问题。小巧注定很多组件需要自己安装。

问题

  • 编写好Dockerfile后,无法启动容器

    1. apline未完装bash,需要安装apk add bash
    2. start.sh为后台运行,需要改为直接运行,去掉启动命令中的&
  • 时间为UTC,而不是北京时间

    这个问题实际是Docker镜像问题,和apline无关。因为编写Dockerfile时做了处理,所以一并列出。

    1
    2
    3
    apk add tzdata
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo "Asia/shanghai" >> /etc/timezone
  • 验证码无法使用,提示如下:

    1
    2
    3
    4
    Caused by: java.lang.NullPointerException
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
    at sun.awt.FontConfiguration.init(FontConfiguration.java:107)

    网上搜索发现为apline缺少字库导致

    1
    apk add font-adobe-100dpi ttf-dejavu fontconfig
  • 下载源速度慢

    使用阿里云镜像加速

    1
    2
    echo http://mirrors.aliyun.com/alpine/v3.7/main/ >> /etc/apk/repositories
    apk update

镜像

最后的Dockerfile,需要增加的处理如下:

1
2
3
4
5
6
7
8
9
10
FROM daocloud.io/library/java:8-jdk-alpine
LABEL maintainer="L4qiang@gmail.com"

RUN echo http://mirrors.aliyun.com/alpine/v3.7/main/ >> /etc/apk/repositories
RUN apk update
RUN apk add bash tzdata font-adobe-100dpi ttf-dejavu fontconfig
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/shanghai" >> /etc/timezone

...

说明

最近项目迁移,顺便将Mysql数据库从5.7升级到8.0,记录下升级中的碰到的问题和一些处理。采用SpringBoot集成Jfinal,使用Druid管理数据库连接,同样适用于只使用Jfinal的用户。

准备Mysql

使用Docker来完成Mysql8的环境准备(这里假设你已安装好Docker CE),可以到DockerHub上看是否有最新版本。

1
docker run --name mysql8 -p 3306:3306 MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

修改pom.xml

1
2
3
4
5
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>

修改DruidPlugin配置

1
DruidPlugin druidPlugin = new DruidPlugin("jdbcUrl", "user", "password", "com.mysql.cj.jdbc.Driver");

问题

此处一定要增加驱动名com.mysql.cj.jdbc.Driver,否则会报Cannot resolve com.mysq.jdbc.Connection.ping method. Will use 'SELECT 1' instead错。

修改配置

1
2
3
4
activerecord:
url: jdbc:mysql://ip:port/db?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=GMT
username: user
password: password

问题

  • 5.7版本时使用zeroDateTimeBehavior=convertToNull,需要调整为zeroDateTimeBehavior=CONVERT_TO_NULL
  • 如果提示MySQLNonTransientConnectionException: Public Key Retrieval is not allowed,增加allowPublicKeyRetrieval=true或者增加Timezone设置,如serverTimezone=GMT。具体原因可能参看https://mysqlconnector.net/connection-options/
  • 如果使用了asText(),需要修改成ST_asText()。

暂未发现其他问题,如遇到会进一步更新本文档。

Mysql8新特性

以下简要列出Mysql8.0的一些新特性,主要参考这里,建议直接看Mysql官网说明。

  • 默认字符集由latin1变为utf8mb4
  • MyISAM系统表全部换成InnoDB表
  • 自增变量持久化
  • DDL原子化
  • 参数修改持久化
  • 新增降序索引
  • group by 不再隐式排序
  • JSON特性增强
  • redo & undo 日志加密
  • innodb select for update跳过锁等待
  • 增加SET_VAR语法
  • 支持不可见索引
  • 支持直方图
  • 新增innodb_dedicated_server参数
  • 日志分类更详细
  • undo空间自动回收
  • 增加资源组
  • 增加角色管理

概述

Mysql从5.7.8版本开始支持JSON字段,可以高效的处理JSON文档。相比字符串字段,JSON字段有下面的几处优势:

  • 自动的校验JSON格式,无效的文档会产生错误
  • 优化的存储格式(结构化的二进制格式),访问数据时不需要额外的解析,可能通过键或者数组索引来直接该问数据,而不是读取整个字段。

JSON字段的存储空间要求与LONGBLOB和LONGTEXT是一样的(L + 4 bytes, where L < 2^32)。同时JSON字段的默认值只能是NULL。

为了操作JSON字段,提供了一系列的JSON和GeoJSON函数。

和其他的二进制类型一样,JSON字段不支持索引,但可以通过提取值的方式生成(虚拟)索引。

创建JSON值

新增JSON类型字段与其他类型没什么不同,插入时可以直接按字符串的方式进行插入,但必须是合法的JSON格式,如果不是语法直接报错。另外需要注意的是JSON字段使用utf8mb4字符集和uft8mb4_bin排序,因此1.其他字符集的字符串会被转换,2.JSON文档旭大小写敏感的,null,true,false只能用小写。

下面是官网的一些例子和自己的补充。

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.

--下面语法也是能成功插入
mysql> insert into t1 values('true');
mysql> insert into t1 VALUES('1');

对于不太确定是否是MySql中支持的json内容,可以通过JSON_TYPE()进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.


mysql> select JSON_TYPE('true');
+----------------------+
| JSON_TYPE('true') |
+----------------------+
| BOOLEAN |
+----------------------+
mysql> select JSON_TYPE('1');
+----------------------+
| JSON_TYPE('1') |
+----------------------+
| INTEGER |
+----------------------+
mysql> select JSON_TYPE('2019-01-01');
ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_type: "The document root must not be followed by other values." at position 4.

通过JSON_ARRAY()可以生成JSON数组。

1
2
3
4
5
6
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+

通过JSON_OBJECT()可以生成JSON对象。

1
2
3
4
5
6
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+

如果使用JSON_OBJECT()插入数据需要处理引号(“)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mysql> CREATE TABLE facts (sentence JSON);

--官网中说这个会无效,实际测试中是有效的。
mysql> INSERT INTO facts VALUES
> (JSON_OBJECT("mascot", "Our mascot is a dolphin named \"Sakila\"."));

--官网中说需要使用这个,实际测试时却报错。
mysql> INSERT INTO facts VALUES
> ('{"mascot": "Our mascot is a dolphin named \\"Sakila\\"."}');
Unknown command '\\'.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\"."))' at line 1

mysql> SELECT sentence FROM facts;
+---------------------------------------------------------+
| sentence |
+---------------------------------------------------------+
| {"mascot": "Our mascot is a dolphin named \"Sakila\"."} |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT col->"$.mascot" FROM qtest;
ERROR 1146 (42S02): Table 'test.qtest' doesn't exist
mysql> SELECT sentence->"$.mascot" FROM facts;
+---------------------------------------------+
| sentence->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT sentence->>"$.mascot" FROM facts;
+-----------------------------------------+
| sentence->>"$.mascot" |
+-----------------------------------------+
| Our mascot is a dolphin named "Sakila". |
+-----------------------------------------+
1 row in set (0.00 sec)

其实如果要简单点就是用单引号(‘)。

1
2
mysql> INSERT INTO facts VALUES(JSON_OBJECT('mascot', 'Our mascot is a dolphin named "Sakila".'));
Query OK, 1 row affected (0.00 sec)

而通过JSON_MERGE()可以合并两个JSON文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT JSON_MERGE('["a", 1]', '{"key": "value"}');
+--------------------------------------------+
| JSON_MERGE('["a", 1]', '{"key": "value"}') |
+--------------------------------------------+
| ["a", 1, {"key": "value"}] |
+--------------------------------------------+

mysql> SELECT JSON_MERGE('{"key1":"value1"}', '{"key2":"value2"}');
+------------------------------------------------------+
| JSON_MERGE('{"key1":"value1"}', '{"key2":"value2"}') |
+------------------------------------------------------+
| {"key1": "value1", "key2": "value2"} |
+------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT JSON_MERGE('1', '{"key2":"value2"}');
+--------------------------------------+
| JSON_MERGE('1', '{"key2":"value2"}') |
+--------------------------------------+
| [1, {"key2": "value2"}] |
+--------------------------------------+
1 row in set, 1 warning (0.00 sec)

以上例子可以看出JSON_MEGER是根据两个JSON文档的类型来结构返回类型的,类型相同时不转换,类型不同时转为JSON数组。还有些细节可能参看官网Normalization, Merging, and Autowrapping of JSON Values

查询和修改JSON值

通过JSON_EXTRACT()可以提取JSON文档值,具体语法说明参看JSON Path Syntax

1
2
3
4
5
6
mysql> SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan" |
+---------------------------------------------------------+

通过JSON_SET()来修改值。

1
2
3
4
5
6
7
8
mysql> SET @j = '["a", {"b": [true, false]}, [10, 20]]';

mysql> SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+--------------------------------------------+
| JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+--------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20, 2]] |
+--------------------------------------------+

通过JSON_INSERT()来插入新值,但不替换旧值。

1
2
3
4
5
6
mysql> SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+-----------------------------------------------+
| JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+-----------------------------------------------+
| ["a", {"b": [true, false]}, [10, 20, 2]] |
+-----------------------------------------------+

通过JSON_REPLACE()来替换旧值而忽略新值。

1
2
3
4
5
6
mysql> SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+------------------------------------------------+
| JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+------------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20]] |
+------------------------------------------------+

通过JSON_REMOVE()来移除文档中的值。

1
2
3
4
5
6
mysql> SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');
+---------------------------------------------------+
| JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]') |
+---------------------------------------------------+
| ["a", {"b": [true]}] |
+---------------------------------------------------+

聚合查询

对于JSON文档的聚合查询(MIN,MAX,GROUP_CONCAT)没有什么实际意义,是不支持的。

  • 将对象序列化为String时出现$ref对象。
    可能通过禁用,DisableCircularReferenceDetect来解决。
    1
    JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)

在前一家公司的时候一次会议上,老板举了个例子,是从现在有多少荷花(具体多少已记不清了),荷花每天长一倍,问多少天长满池塘。这是一个奥数题的翻版:

池塘里的荷花每天长一倍,30天长满一池塘,问多少天覆盖整个池塘的四分之一?

大家都抢着回答。我当时没有什么感觉,自己也不是智力出众型,不能马上答上来,所以把更多的注意力放了在如何做对这道题,而不显得那么傻上,现在想想也觉得好笑。

而现在回想起来老板是希望我们关注以下几点吧:

  1. 关注的是指数增长。但我除了课堂的学习从未将它与生活,工作联系起来。

  2. 体会时间的重要性。但因为是按天来算的,反而我低估了时间的力量。

  3. 关注增长率,但因为是成倍增长,让我高估了成长率。

一个例子被举出来时,听的人可能很大程度上不能感同身受,不能体会它的力量。但就像是种下一颗种子一样,在那等待生根发芽,静待花开,突然你会有一天发现,而后感叹。

从近期的学习来看,我们的成长速度显然不大可能达不到荷花的程度,但保持足够的耐心,特别是接受自己起步时的不好,一定会看到一个指数的增长。

另外需要记住70这个数字(Why not 42),如果成长率是1%,那么需要70年翻倍。(《清醒的思考艺术》P138,指数增长,计算倍增时间,请用数字70除以增长的百分比。)

本文描述最新版本CentOS(CentOS-7-x86_64-DVD-1810)单机安装oVirt及创建虚拟机的过程。
本文主要为自己做记录,以便下次重装时有参考。
本文主要参考oVirt官网的安装指南

阅读全文 »

使用Navicat打开Mysql连接并闲置一段时间后卡顿(旧版本可能直接无响应或异常退出)。

出现这种情况,可通过如下两种方式来调整:

  • 修改Mysql的Wait_timeout属性(默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接)。
  • 设置Navicat连接属性中的高级选项,勾选保持连接间隔,并设置为30(小于wait_timeout即可)。

说明

本文内容主要是对香帅北大金融学课《金融创新的本质是思想革命》的摘录。

著名经济学家熊彼特这样定义创新,所谓创新,就是新的生产函数的建立。所谓新的生产函数,就包括新产品,新市场、新的组织方式。

所以我们很容易判断,ATM机是金融创新,资产证券化是金融创新,股份制公司是新的组织方式,而支付宝等移动支付则是新的交易模式,也都是金融创新。

香帅老师认为,熊彼特指的这类创新(新的生产函数的建立)是金融创新来讲是第一层含义,也就是工具创新,而金融创新的背后还有一层含义,金融创新的本质是思想革命。

工具的革新,它是形,而思想革命才是灵魂。而这一部分,没有在主流的金融学中涉及,所以你在任何教科书上也看不到这些,但其实,这才是金融对人类文蝗的最大贡献所在。

那么思想革命和金融创新到底是怎么相互影响,就需要从两个方面来讲,一个是12世纪开始的国债,一个是17世纪开始流行的股份制公司。

股和债,是构筑金融市场的两个最基本的工具,实际上你不知道的是它们也是人类思想史上的两次飞跃。

债:时间货币化,将人从神那儿解放出来

这段解释是我觉得最神奇而又合理的地方,神奇是因为有一个全新的认识,合理呢是因为从历史的娓娓道来,让人信服。

债务关系是人类最古老的关系。但是,你知道吗?债权人有欧洲很长时间内,都被为邪恶的代名词,利息是被视为违法的。

为什么呢?你可以想一下,利息是什么?是资金使用的时间价值。所以,实际上利息是对时间的定价。这个概念你听上去很稀松平常,但你要知道,这个概念,在中世纪的欧洲是绝对的离经叛道。

从这个角度,可以加深李笑来老师关于《概念是一切知识的基识》,我们继续。

当时,我们的人类社会经历了长时间的低生产力的水平以后,对自然是又敬又畏,所以很多事情都被认为是神的安排。而生命的过程,就是对神的赎还过程。换句话说,人的时间是属于神的。

好,这是插播一句,咱们古代中国其实是个非常有趣的地方,周王自称天子以为,诸神归位,世俗君主和神明合二为一。所有的中国老百姓都是天子臣民。所以,中国老百姓的时间是属于天子皇帝的。所以,古代没钱交税的时候,可以服徭役去抵,也就是用时间去抵税。

但欧洲不一样,欧洲是群权神授,到现在为止,欧洲很多王室国家的国王登基的时候,仍然是主教为君主加冕。所以它象征君王的权力是神给予的。所以,人们的时间是属于神,属于上帝。

好了。说到这的时候你就明白了,既然你的时间是属于神的,属于上帝的,那么收取利息,收取时间的价值,那就意味从上帝那里偷窃了时间,偷窃了价值。这不是我说的,这是欧洲的经典文献里面告诉我的。传教士说:收利息的人都是在上帝那儿偷时间、偷窃价值。

所以说,在欧洲的中世纪,高利贷、收利息是被严格禁止的。即使有人干,也是小范围、小规模的。

就这么一个传统,大大的限制了人的思想的活跃度。

直到12世纪,这个传统终于被威尼斯这个城邦小国给打破了。威尼斯我们知道,是意大意北部一个商人传统浓厚的城邦小国。它因为战争的原故,就被逼向全体国民借钱,即发行公债,所有的威尼斯人都成为了国家的债权人。

公(国)债它使得国民有了投资工具,可以分享国家成长,把国和民的利益统一起来。除了这个意义之外,更重的是,公债使所有的威尼斯的都接收到一个信息,即:金钱是可以繁衍生息的物品。

不要小看这句话,在宗教氛围浓厚的当时,这是对神权的极大挑战,它意味着在上帝之外,我们人类创造了一个超越神权的生物,而这个生物居然可以替属于上帝的时间定价。换句话说,最具有神性的时间被货币化和世俗化了,这一步,对欧洲产生的整个震荡其实是不可想象的。

尽管当时很多传教士斥责国债是对时间的偷窃。但是,因为国债太好用了,一下子帮欧洲的小国解决了筹资的问题,而国民也很喜欢。所以,欧洲各个小国开始争先恐后地发国债,甚至开始学会用国债做抵押,进行再融资。

随着,国债在欧洲的推广,时间被大规模地世俗化和货币化。这种认知改变是全社会性的,也意味着将人从神那儿解放出来。而这种认知上的改变,才是社会变革的真正基础。所以,欧洲的思想启蒙是从金融概念、公债开始的。

股:将人从“人”这儿解放出来

很多人都知道,社会阶层,包括什么国王贵族、平民奴隶。抛开这些名词,你会发现,不同的社会阶层是由他们的资金集聚能力所决定的。

你要仔细体会一下这句话。再想想,我们现代社会上什么富豪、权贵、平民的划分,其实根本区别也就在于我们的资金资源的集聚动员的能力不同,也就是广义上的个人信息不同。

学习金融的一个好处就是能看到更本质的东西,这里需要注意的是,资金的集聚能力是具有马太效应的。

在封建的欧洲,大部分人属于领主,所以他们是多少存在着附属的人身关系的,他们谈不上个体信用,更谈不上大规模集聚资金的能力,世俗贵族和国王例外。所以你要打破这种能力约束,就可能靠战争改变你的身份。

但是,股份制出现了,它使得人和人之间产生一种利益共享、风险共担的机制。这种机制打破了资金调集能力的约束,你的身份不要紧,项目才要紧,只要你的项目能替大家赚到钱,就是募集到资金。很多海上贸易探险家,通过这样的方式完成了阶级的跨迁。

后来随着股份制的推广,欧洲的工业革命也才有了资金基础,新兴的工业家、资本家也才能够登上历史舞台。

欧洲那种固化的阶层被打破,一场深刻的社会革命从此开始。

如果说“债”让时间货币化、世俗化,将人从神那里解放出来。那么,“股”就是打破了资源集聚能力的约束,将“人”从这儿解放出来。这才是欧洲自由义的根源所在,也是金融创新对人类文明的贡献所在。

像希克斯就说过,工业革命一直在等待一场金融革命。工业革命的很多技术13世纪就有,为什么要等到18世纪才爆发?为什么要等到社会观念的转变,人力资本的释放,以及大规模资金聚集的约束的打破?这种思想革命,才是金融创新最大的力量,它不仅仅改变了欧洲的力量版图,也对未来世界的走向产生深远的,甚至是决定性的影响。

我想,这才是金融创新最核心、最强大的力量所在。

对于个人而言,如何改变自己资金聚集的能力呢?我想应该是成为有用的人,对他人有用(解决问题),对社会有用(纳税,创造就业机会),不断增加个人信用,创造影响力。

概要

在“SpringBoot与Jfinal合体”中说到,使用代码生成技术,大大简化了编码量。但在爽的时候也要时刻注意,自动生成的代码是可能存在问题的,排查问题时不要忽略。

记一次排查过程

在整合好了自动代码生成基础框架后,交给同事处理,具体业务需求。一开始一切正常,后面新增加了表,自动生成后,测试对应接口也是正常。

中间因为有其他任务安排,这部分任务先停了一段时间,这两天回来重新实现业务时,发现接口调用不了,提示空指针。

在排除了Maven依赖等问题之后,基本能判断是ActiveRecordPlugin的配置没有读到引起的,但查看ActivePlugin的注入的代码(包括SQL文件)都是正常的。

感觉有点无解的时候,想到要不重新生成试试,因为主要是Model的问题,于是重新生成了Model。之后运行代码,一切正常了。
重新核对,发现是_MappingKit,是表和类的映射关系只有一张表。

最后确认,当时看只要增加一张表,于是把之前的表屏蔽了,同时因为测试了新的接口是正常的,也就没有注意到生成的映射关系有问题。
而我自己呢因为是自动生成的代码没有注意排查。

注意事项

代码自动生成有好的一面,也有不足的一面(代码覆盖问题),而一个架构好用就在于能使用少犯错。在架构没有起来之前也就是靠人治,如规范,培训及惩罚等。

  1. 代码自动生成,最好使用在新项目中。
  2. 代码自动生成,应该区分可变不可变内容,让覆盖更合理,让编码更放心。
  3. 代码自动生成,代码可能被覆盖或修改,排查问题时不要忽略。
  4. 修改代码生成器配置时,一定在注意影响范围并测试。